/*----------------------------------------------------------------------*/
static void wavDataEncode( void *data ) /* This function works in L1Audio Task */
{
   int32 I, count, write_count;
   uint16 *rb_addr, *rb_end, sample_count, *SCptr, *ptr, frame_len;

   (void)data;
   SCptr = &sample_count;
   rb_end   = &wav.ctrl->rb_base[wav.ctrl->rb_size];
   rb_addr  = &wav.ctrl->rb_base[wav.ctrl->write];

   if( wav.ctrl->end_status == MEDIA_TERMINATED) {
      if( (wav.ctrl->format==MEDIA_FORMAT_WAV_DVI_ADPCM || wav.ctrl->format==MEDIA_FORMAT_WAV_DVI_ADPCM_16K )
         && wav.BlockCount != 128 && wav.state == WAV_STATE_IDLE) {
         write_count = 0;
         if (wav.BlockCount == 0) {
            count = 505;
         } else if (wav.BlockCount == 1) {
            count = 504;
         } else {
            count = 128 - wav.BlockCount;     /* zero padding the latest block */
            count <<= 2;
            count -= wav.data_count;
         }
         
         for( I = count; I > 0; I-- ) {
            if( wav.PutSample( &rb_addr, 0 , SCptr) ) {
               write_count++;
               wavHeader.wRiffLength+=2;
               wavHeader.wDataLength+=2;
               wavHeader.wSamplesWritten += sample_count;
               if( rb_addr == rb_end )
                  rb_addr = &wav.ctrl->rb_base[0];
            }
         }
         wav.ctrl->write += write_count;
         if( wav.ctrl->write >= wav.ctrl->rb_size )
            wav.ctrl->write -= wav.ctrl->rb_size;
      }
      return;
   }

   while( (uint8)(wav.tmp_w - wav.tmp_r) > 0 ) {
      write_count = 0;
      ptr = wav.tmp_buf[wav.tmp_r&FRAME_BUF_MASK];
#ifdef   DSP_DEBUG_DEDICATED_MODE_RECORD
      if( FRAME_BUF_SIZE * 2 <= mediaGetFreeSpace() ) {
         for( I = FRAME_BUF_SIZE * 2; I > 0; I-- ) {  /* writing to MB */
#else    // DSP_DEBUG_DEDICATED_MODE_RECORD
      if ( wav.ctrl->format==MEDIA_FORMAT_WAV_DVI_ADPCM_16K || wav.ctrl->format==MEDIA_FORMAT_PCM_16K  )
         frame_len = FRAME_BUF_SIZE_16K;
      else
         frame_len = FRAME_BUF_SIZE;
#if defined(__DUAL_MIC_SUPPORT__) && defined(__HQA_AUDIO__)
      if(wav.ctrl->is_stereo)
         frame_len = frame_len*2;
#endif
      if( frame_len <= mediaGetFreeSpace() ) {
         for( I = frame_len; I > 0; I-- ) {  /* writing to MB */
#endif   // DSP_DEBUG_DEDICATED_MODE_RECORD
            if( wav.PutSample( &rb_addr, *ptr++, SCptr) ) {
               write_count++;
               wavHeader.wRiffLength+=2;
               wavHeader.wDataLength+=2;
               wavHeader.wSamplesWritten += sample_count;
               if( rb_addr == rb_end )
                  rb_addr = &wav.ctrl->rb_base[0];
            }
         }
         wav.ctrl->write += write_count;
         if( wav.ctrl->write >= wav.ctrl->rb_size )
            wav.ctrl->write -= wav.ctrl->rb_size;
      }
      wav.tmp_r++;
   }
}

static bool wavGetDWord(uint8 *pBuf, uint32 *readPos, uint32 len, uint32 *data32)
{
   uint32 readPosCache;
   uint8 *pTemp;
   
   readPosCache = *readPos;
   pTemp = pBuf + readPosCache;
   
   // Check the length
   if (len < readPosCache+4)
      return false;

   *data32 = pTemp[0] | (pTemp[1]<<8) | (pTemp[2]<<16) | (pTemp[3]<<24);
   *readPos = readPosCache + 4;
   return true;
}

static bool wavGetWord(uint8 *pBuf, uint32 *readPos, uint32 len, uint16 *data16)
{
   uint32 readPosCache;
   uint8 *pTemp;
   
   readPosCache = *readPos;
   pTemp = pBuf + readPosCache;
   
   // Check the length
   if (len < readPosCache+2)
      return false;

   *data16 = pTemp[0] | (pTemp[1]<<8);
   *readPos = readPosCache + 2;
   return true;
}
Esempio n. 2
0
static void pcmReadFromDSP( void )
{
#if defined(MT6260)

#ifndef UPPER_BOUND
#define UPPER_BOUND(in,up)  ((in) > (up) ? (up) : (in))
#endif

    kal_uint16 *rb_addr, *rb_end;
    kal_int32 write_count = 0;
    kal_int32 count = mediaGetFreeSpace();
    kal_int32 I = (kal_int32)Pseudo_SAL_PcmEx_GetBufLen(PSEUDO_SAL_PCMEX_BUF_IDLE_SE);;

    count = UPPER_BOUND(count, I);

    if (count == 0)
    {
        return;
    }

    rb_end  = &pcm.ctrl->rb_base[pcm.ctrl->rb_size];
    rb_addr = &pcm.ctrl->rb_base[pcm.ctrl->write];

    if (Media_IsRecordSilence())
    {
        for (I = 0; I < count; I++)
        {
            if (pcm.PutSample(&rb_addr, 0))
            {
                write_count++;
                if (rb_addr == rb_end)
                {
                    rb_addr = &pcm.ctrl->rb_base[0];
                }
            }
        }
    }
    else
#ifdef L1AUDIO_IDMA_ALL_ADDRESS_MODE
    {
        volatile kal_uint16 *dspAddr = Pseudo_SAL_PcmEx_GetBuf(PSEUDO_SAL_PCMEX_BUF_SE);
        
        for (I = 0; I < count; I++)
        {
           if( pcm.PutSample( &rb_addr, *dspAddr++ ) ) 
           {
              write_count++;
              if( rb_addr == rb_end )
              {
                 rb_addr = &pcm.ctrl->rb_base[0];
              }
           }
        }
    }
#else
    {
        volatile kal_uint16 *dspAddr = Pseudo_SAL_PcmEx_GetBuf(PSEUDO_SAL_PCMEX_BUF_SE);
        kal_uint16 dummy = *dspAddr;
   
        for (I = 0; I < count; I++)
        {
            if (pcm.PutSample(&rb_addr, *IDMA_SHORT_ADDR)) 
            {
                write_count++;
                if (rb_addr == rb_end)
                {
                    rb_addr = &pcm.ctrl->rb_base[0];
                }
            }
        }
   }
#endif
#else   // chip compile option

#ifdef L1AUDIO_IDMA_ALL_ADDRESS_MODE
   volatile kal_uint16* idmaPtr;
#endif

	 kal_int32 I, count, write_count = 0;
   kal_uint16 *rb_addr, *rb_end, ptr_addr;

   count = mediaGetFreeSpace();

   if ( pcm.ctrl->format == MEDIA_FORMAT_PCM_16K )
      I = DSP_PCM_16K_REC_LEN;
   else
      I = (kal_int32)(*DSP_PCM_REC_LEN);
   if( I < count )
      count = I;
   if( count == 0 )
      return;

   rb_end   = &pcm.ctrl->rb_base[pcm.ctrl->rb_size];
   rb_addr  = &pcm.ctrl->rb_base[pcm.ctrl->write];

   if(Media_IsRecordSilence())
   {
      for( I = 0; I < count; I++ )
      {
         if( pcm.PutSample( &rb_addr, 0 ) ) 
         {
            write_count++;
            if( rb_addr == rb_end )
            {
               rb_addr = &pcm.ctrl->rb_base[0];
            }
         }
      }
   }
   else
#ifdef L1AUDIO_IDMA_ALL_ADDRESS_MODE
   {
      if ( pcm.ctrl->format == MEDIA_FORMAT_PCM_16K )
      { 
         ptr_addr = *DSP2_DM_ADDR(PAGE_NUM, DSP_PCM_16K_REC_PTR);
         idmaPtr=DSP2_DM_ADDR(PAGE_NUM, ptr_addr);
      
      }
      else
      {
         idmaPtr=DSP_DM_ADDR(PAGE_NUM, *DSP_PCM_REC_ADDR);
      }
      for( I = 0; I < count; I++ )
      {
         if( pcm.PutSample( &rb_addr, *idmaPtr++ ) ) 
         {
            write_count++;
            if( rb_addr == rb_end )
            {
               rb_addr = &pcm.ctrl->rb_base[0];
            }
         }
      }
   }
#else// L1AUDIO_IDMA_ALL_ADDRESS_MODE
   {
      kal_uint16 dummy;
      if ( pcm.ctrl->format == MEDIA_FORMAT_PCM_16K )
      { 
         ptr_addr = *DSP2_DM_ADDR(PAGE_NUM, DSP_PCM_16K_REC_PTR);
         dummy    = *DSP2_DM_ADDR(PAGE_NUM, ptr_addr);
      }
      else
      {
         dummy = *DSP_DM_ADDR(PAGE_NUM, *DSP_PCM_REC_ADDR);
      }
   
      for( I = 0; I < count; I++ )
      {
         if( pcm.PutSample( &rb_addr, *IDMA_SHORT_ADDR ) ) 
         {
            write_count++;
            if( rb_addr == rb_end )
            {
               rb_addr = &pcm.ctrl->rb_base[0];
            }
         }
      }
   }
#endif
#endif  // chip compile option
   pcm.MIC1_framesize = write_count;
   pcm.ctrl->write += write_count;
   if( pcm.ctrl->write >= pcm.ctrl->rb_size )
   {
      pcm.ctrl->write -= pcm.ctrl->rb_size;
   }
}