📄 audiowrap.c
字号:
data = C2FlagsVect[3] + (C2FlagsVect[4] << 8) + (C2FlagsVect[5] << 16); // # 5 4 3 data <<= 8; // 5 4 3 # if(C2_flags_in_idx != 643) data |= ((data_3>>24)&0xFF); out_ptr[C2_flags_out_idx] = data; C2_flags_out_idx += 7; data_3 = in_ptr[SubCode_idx++]; data = C2FlagsVect[6] + (C2FlagsVect[7] << 8) + (C2FlagsVect[8] << 16); // # 8 7 6 data <<= 8; // 8 7 6 # data |= (data_3&0xFF); out_ptr[C2_flags_out_idx] = data; C2_flags_out_idx += 7; data = C2FlagsVect[9] + (C2FlagsVect[10] << 8) + (C2FlagsVect[11] << 16); // # 11 10 9 data <<= 8; // 11 10 9 # data |= ((data_3>>8)&0xFF); out_ptr[C2_flags_out_idx] = data; C2_flags_out_idx += 7; } //C2_flags_in_idx : 712 //C2_flags_out_idx: 673 4*24=96 //SubCode_idx: 616 616*4=2464 C2_flags_0.all = in_ptr[C2_flags_in_idx++]; // Read C2 Flag 291 290 289 288 C2_flags_1.all = in_ptr[C2_flags_in_idx++]; // Read C2 Flag # # 293 292 C2FlagsVect[0] = C2_flags_0.field.flags_4n; // C2 Flag 0 C2FlagsVect[1] = C2_flags_0.field.flags_4np1; // C2 Flag 1 C2FlagsVect[2] = C2_flags_0.field.flags_4np2; // C2 Flag 2 C2FlagsVect[3] = C2_flags_0.field.flags_4np3; // C2 Flag 3 C2FlagsVect[4] = C2_flags_1.field.flags_4n; // C2 Flag 4 C2FlagsVect[5] = C2_flags_1.field.flags_4np1; // C2 Flag 5 data = C2FlagsVect[0] + (C2FlagsVect[1] << 8) + (C2FlagsVect[2] << 16);// # 2 1 0 data <<= 8; // 3 2 1 # data |= ((data_3>>16)&0xFF); out_ptr[C2_flags_out_idx] = data; C2_flags_out_idx += 7; data = C2FlagsVect[3] + (C2FlagsVect[4] << 8) + (C2FlagsVect[5] << 16); // # 5 4 3 data <<= 8; // 5 4 3 # data |= ((data_3>>24)&0xFF); out_ptr[C2_flags_out_idx] = data; //C2_flags_in_idx : 714 //C2_flags_out_idx: 687 4*687=2748#endif#if (1 == HAVE_SHOCK_MEMORY) if (ADPCM_ON == cap_config.adpcm) { // CD Data Formatting: in_idx = 0; out_idx = 1; for (efm_idx = 0; efm_idx < 49; efm_idx++) { data = (in_ptr[in_idx] & 0x0000FFFF) << 16; // #0 out_ptr[out_idx++] = data; data = (in_ptr[in_idx++] & 0xFFFF0000) >> 16; // #1 data += ((in_ptr[in_idx] & 0x0000FFFF) << 16); // #2 out_ptr[out_idx++] = data; data = (in_ptr[in_idx++] & 0xFFFF0000); // #3 out_ptr[out_idx++] = data; data = in_ptr[in_idx++]; // #4,#5 out_ptr[out_idx++] = data; } /* Copy only mark byte for adpcm enc/dec reset */ in_idx = 150; //177; out_idx = 1; data = out_ptr[out_idx]; data |= ((in_ptr[in_idx] >> 16) & 0xFF); out_ptr[out_idx] = data; } else#endif { // CD Data Formatting: in_idx = 0; out_idx = 2; for (efm_idx = 0; efm_idx < 98; efm_idx++) //588 { for (i = 0; i < 6; i++) { data = in_ptr[in_idx++]; out_ptr[out_idx++] = data; } out_idx++; // Skip C2 Flag & Subcode Raw; } }}void AudioInit(void){ //create input bitstream AudioBitstream_p = &AudioDecoderBitstreamStructure; //AudioBuffer_p_AudioDec = AudioBuffer[0].data; /* MP3Output_p->channels[0] = (void *) AudioBuffer[0].data; MP3Output_p->channels[1] = (void *)(AudioBuffer[0].data + 1); // 4 bytes per sample */ // Cannot assume data is already present in FrameBuffer // so leave the decoder in not initialized state AudioDecoderNextState = notInitializedAudioDec; decoderPlayMode = playModePlay;}decoderReturnType AudioDecode(int flag){ t_position position; static ElementFlagType nextElementFlag; uint8 FB_clearFrom; uint8 FB_clearTill; while (1) { switch (AudioDecoderNextState) { case notInitializedAudioDec: { // set pointer according to g_FB_readFrom AudioBitstream_p->data = (unsigned char *) FrameBuffer[(g_FB_readFrom % FrameBufferElements) + 1].data; AudioBitstream_p->dataLength = 0; AudioBitstream_p->dataOffset = 0; nextElementFlag = FT_FIRST; // Don't leave the loop, there may be more data already available AudioDecoderNextState = decodingBlocksAudioDec; pBufferElementAudioDec = FrameBuffer[0]; // reset last pBufferElementAudioDec, not to copy the last break; } case decodingBlocksAudioDec: { // Decoding of uncompressed data is ongoing. Continue until // - no more uncompressed data is available // - not enough space in output buffer available if ((AudioBuffer_p_AudioDec = AudioBufferHaveSpace(kDecoderSampleRate_44100Hz)) == NULL) { //output buffer is full AudioDecoderNextState = waitingAudioBufferAudioDec; return decoderWaitingABempty; } switch (AudioUpdateBitstream(AudioBitstream_p, flag)) { case waitingForDataAudioDec: //not enough data return decoderWaitingFBdata; case dataEOFAudioDec: //EOF ClearFBElement(pBufferElementAudioDec.en); return decoderEOF; //if not enough input data, don't decode them, could cause bad output //break; case dataReadyAudioDec: //data ready break; case immediateEOFAudioDec: // request from Controller return decoderEOF_immediate; } AudioBitstream_p->dataOffset = 2352; //2856; // Update bitstream data pointers AudioDecodeBlock((uint32 *)(AudioBitstream_p->data), (uint32 *) AudioBuffer_p_AudioDec); // set number of DECODED bytes SetDecodedBytes(AudioBitstream_p->dataLength - AudioBitstream_p->dataOffset); //decoderDecodedBytes = decoderReadBytes - (AudioBitstream_p->dataLength - AudioBitstream_p->dataOffset); GetCurrentPosition(&position); // xid,playlist position.offset = ASUBCODE_2_BYTES(pBufferElementAudioDec.subcode); pBufferElementAudioDec.subcode.q_subcode.xid = pBufferElementAudioDec.subcode.q_subcode.q_tno; //clear used FB elements FB_clearFrom = GetElementNumber((unsigned char*)(AudioBitstream_p->data)); FB_clearTill = GetElementNumber((unsigned char*)(AudioBitstream_p->data+AudioBitstream_p->dataOffset)); SetEmptyFBE(FB_clearFrom,FB_clearTill); pBufferElementAudioDec.subcode.event_subcode = 1; // CDDA - info for AB to enable/disable de-emphasis //some output samples have been generated#if (1 == HAVE_SHOCK_MEMORY) if (ADPCM_ON == cap_config.adpcm) { AudioBufferSetFull(197, nextElementFlag, (tDecoderTime_event *)(&(pBufferElementAudioDec.subcode)), &position); //MP3Output_p->numberOfSamples = 788/4 = 197 mono word } else#endif { AudioBufferSetFull(687, nextElementFlag, (tDecoderTime_event *)(&(pBufferElementAudioDec.subcode)), &position); //MP3Output_p->numberOfSamples = 2748/4=687 mono word } nextElementFlag = FT_MIDDLE; AudioDecoderNextState = decodingBlocksAudioDec; break; } //case decodingBlocks case waitingAudioBufferAudioDec: { // Decoding of uncompressed data is going on, but the decoder // ran out of space in the AudioBuffer. This means we // decode data faster than it is being consumed by // the audio hardware. Return to caller to be put to sleep. if ((AudioBuffer_p_AudioDec = AudioBufferHaveSpace(kDecoderSampleRate_44100Hz)) == NULL) { //output buffer is full return decoderWaitingABempty; } AudioDecoderNextState = decodingBlocksAudioDec; break; } //case waitingAudioBuffer } //switch MP3DecoderNextState } //while}void AudioKill(DecoderKillType killType){ if (killType == closeOnly) { AudioDecoderNextState = notInitializedAudioDec; } else if (killType == destroy) { //AudioDecoderNextState = notInitializedAudioDec; //FREE(MP3Requirements_p->instanceStateSize); //FREE(MP3Requirements_p->scratchSize); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -