⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 audiowrap.c

📁 本程序为ST公司开发的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
  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 + -