| 988 | } |
| 989 | |
| 990 | int32_t AudioEncode(ReadSampleFunction *read, void *data, unsigned channels, unsigned sample_rate, float volume, |
| 991 | FILE *out, int levels, int samples_per_subband, float comp_ratio) { |
| 992 | Encoder enc; |
| 993 | memset(&enc, 0, sizeof(enc)); |
| 994 | |
| 995 | if (!ReadSample_init(enc, read, data)) { |
| 996 | DestroyEncoder(enc); |
| 997 | return 0; |
| 998 | } |
| 999 | |
| 1000 | if (!bits_init(enc.m_bits, out)) { |
| 1001 | DestroyEncoder(enc); |
| 1002 | return 0; |
| 1003 | } |
| 1004 | |
| 1005 | enc.m_volume = volume; |
| 1006 | if (!SetupEncoder(enc, 0xF, std_lo_filter, std_hi_filter, levels, samples_per_subband)) { |
| 1007 | DestroyEncoder(enc); |
| 1008 | return 0; |
| 1009 | } |
| 1010 | |
| 1011 | enc.m_threshold = (int32_t)(float(enc.m_samplesPerBlock) * comp_ratio * 16.0f); |
| 1012 | |
| 1013 | int32_t originalPosVAR64 = ftell(out); |
| 1014 | |
| 1015 | // Header |
| 1016 | enc.m_bits.WriteBits(0x97, 8); |
| 1017 | enc.m_bits.WriteBits(0x28, 8); |
| 1018 | enc.m_bits.WriteBits(0x03, 8); |
| 1019 | |
| 1020 | // Version |
| 1021 | enc.m_bits.WriteBits(1, 8); |
| 1022 | |
| 1023 | // Sample Count (Placeholder 32bits for now) |
| 1024 | enc.m_bits.WriteBits(0, 8); |
| 1025 | enc.m_bits.WriteBits(0, 8); |
| 1026 | enc.m_bits.WriteBits(0, 8); |
| 1027 | enc.m_bits.WriteBits(0, 8); |
| 1028 | |
| 1029 | // Number of channels |
| 1030 | enc.m_bits.WriteBits(channels, 16); |
| 1031 | |
| 1032 | // Sample Rate |
| 1033 | enc.m_bits.WriteBits(sample_rate, 16); |
| 1034 | |
| 1035 | // Levels |
| 1036 | enc.m_bits.WriteBits(levels, 4); |
| 1037 | |
| 1038 | // Samples per Sub-band (rows) |
| 1039 | enc.m_bits.WriteBits(samples_per_subband, 12); |
| 1040 | |
| 1041 | enc.m_bandWriteEnabled = 0; |
| 1042 | |
| 1043 | int32_t esi = enc.m_adjustedSamplesTimeNumColumns; |
| 1044 | while (esi) { |
| 1045 | EncodeSample(enc); |
| 1046 | --esi; |
| 1047 | } |
no test coverage detected