Esempio n. 1
0
static void AVB_HISR(void *data)
{
   kal_brief_trace( TRACE_GROUP_SCO, L1AUDIO_AVB_HISR, AVB.uState, AVB.uSegment_W, AVB.uSegment_R);
   AVB.uHisrRunning = KAL_TRUE;
   if(AVB.uState == AVB_STATE_ENDING || AVB.uState == AVB_STATE_IDLE )
   {
      return;
   }
   if( *DSP_TONE_CTRL1 != 0 || *DSP_TONE_CTRL2 != 0 ) //playing speech tone, drop one frame
   {
      if(AVB.uSegment_W > AVB.uSegment_R)
      {
         AVB.uSegment_R++;
      }
   }
   else
   {
      kal_uint16 uDSPAddr;
      kal_int32 i;
      kal_int16 *pDst, *pSrc;
      uDSPAddr = *DSP_DM_ADDR(BT_AUDIO_PLAYBACK_SD_PAGE_NUM, BT_AUDIO_PLAYBACK_SD_PTR_ADDR);
      pDst = (volatile kal_uint16 *)DSP_DM_ADDR(BT_AUDIO_PLAYBACK_SD_PAGE_NUM, uDSPAddr);
      if(AVB.uSegment_W == AVB.uSegment_R || AVB.fSilence)
      {  //fill silence
         for(i=AVB_FRAME_SAMPLE-1;i>=0;i--)
         {
            *pDst++ = 0;
         }
         if(AVB_STATE_FLUSH_PING == AVB.uState)
         {
            AVB.uState = AVB_STATE_FLUSH_PONG;
         }
         else if(AVB_STATE_FLUSH_PONG == AVB.uState)
         {
            AVB.uState = AVB_STATE_ENDING;
         }
      }
      else
      {  //fill data
         pSrc = AVB.pBuffer + (AVB.uSegment_R & AVB_SEGMENT_MASK) * AVB_FRAME_SAMPLE;
         for(i=AVB_FRAME_SAMPLE-1;i>=0;i--)
         {
            *pDst++ = *pSrc++;
         }
      }
      if(AVB.uSegment_W > AVB.uSegment_R)
      {
         AVB.uSegment_R++;
      }
   }
   L1Audio_SetEvent( AVB.uAudID, NULL );
}
Esempio n. 2
0
File: AVB.c Progetto: 12019/mtktest
void avb_HisrHandler(void *data)
{
   uint16 ptr_addr;
   int16 *dspPtr;
   uint32 outputNum,i;
   
   if (AVB.enable == false)
      return;

   if( DSP_TONE_CTRL2 != 0 || DSP_TONE_CTRL1 != 0 ){
      AVB.downsampler->GetSamples( AVB.downsampler, NULL, 160, false, true );
      kal_prompt_trace( MOD_L1SPHISR, "KT1=%x,KT2=%x",DSP_TONE_CTRL1,DSP_TONE_CTRL2);
   }
   else
   {
      ptr_addr = *DSP_DM_ADDR(BT_AUDIO_PLAYBACK_SD_PAGE_NUM, BT_AUDIO_PLAYBACK_SD_PTR_ADDR);
      ASSERT( ptr_addr >= BT_AUDIO_PLAYBACK_SD_ADDR && 
         ptr_addr < (BT_AUDIO_PLAYBACK_SD_ADDR + BT_AUDIO_PLAYBACK_SD_BUF_LEN) );

      dspPtr = (int16 *)DSP_DM_ADDR(BT_AUDIO_PLAYBACK_SD_PAGE_NUM, ptr_addr);
      outputNum = AVB.downsampler->GetOutputNum(AVB.downsampler);
      kal_prompt_trace( MOD_L1SPHISR, "AVB outNum =%d,Put2DSPAddr=%x", outputNum, ptr_addr);
      if ( AVB.buffered < 3 && outputNum >= 1024 ){    // avoid initial discontinuity
         AVB.buffered++;
      }
      if( outputNum > 160 && AVB.buffered > 2 )
         AVB.downsampler->GetSamples( AVB.downsampler, dspPtr, 160, false, false );
      else if ( AVB.flushing ){ 
         if (outputNum >= 160){
            AVB.downsampler->GetSamples( AVB.downsampler, dspPtr, 160, false, false );
            kal_prompt_trace( MOD_L1SPHISR, "AVB Flushing");
         }
         else{
            AVB.downsampler->GetSamples( AVB.downsampler, dspPtr, outputNum, false, false );
            dspPtr += outputNum;
            for( i = outputNum ; i < 160 ; i++ )
               *dspPtr++ = 0;
            kal_prompt_trace( MOD_L1SPHISR, "AVB Flushed");
         }
      }
      else {
         for( i = 160 ; i > 0 ; i-- )
            *dspPtr++ = 0;
         kal_prompt_trace( MOD_L1SPHISR, "AVB fill Silence,outBuf=%d",outputNum);
      }
      
      //get other samples to DSP via DSP
      //dspPtr = (int16 *)IDMA_SHORT_ADDR;
      //AVB.downsampler->GetSamples(AVB.downsampler, dspPtr, 159, true, false);
   }
} 
Esempio n. 3
0
static void pcmWriteDataSegmentByIDMA(pcmStrmMediaHdl *ihdl, int32 DSP_FreeSeg)
{
   const uint16 *buf;
   uint16 dsp_last_sample, dsp_w, read_data;
   int32 I;

   dsp_w = *DSP_PCM_W;

   buf = (uint16 *)&ihdl->mh.rb_base[ihdl->mh.read];

   if (ihdl->mh.mono2stereo){
      if (ihdl->pcmStrm.bitPerSample == 16) {
         dsp_last_sample = *buf++;
         *DSP_DM_ADDR(PAGE_NUM, ihdl->mh.dsp_rb_base + dsp_w) = dsp_last_sample;
         *IDMA_SHORT_ADDR = dsp_last_sample;
         for (I=DSP_FreeSeg-2; I>0; I-=2) {
            dsp_last_sample = *buf++;
            *IDMA_SHORT_ADDR = dsp_last_sample;
            *IDMA_SHORT_ADDR = dsp_last_sample;
         }
         ihdl->mh.read += (DSP_FreeSeg);
      } else {
         read_data = *buf++;
         dsp_last_sample = (read_data<<8) - 0x8000;
         *DSP_DM_ADDR(PAGE_NUM, ihdl->mh.dsp_rb_base + dsp_w) = dsp_last_sample;
         *IDMA_SHORT_ADDR = dsp_last_sample;
         dsp_last_sample = (read_data & 0xFF00) - 0x8000;   	
         *IDMA_SHORT_ADDR = dsp_last_sample;
         *IDMA_SHORT_ADDR = dsp_last_sample;
         for (I=DSP_FreeSeg-4; I>0; I-=4) {
            read_data = *buf++;
            dsp_last_sample = (read_data<<8) - 0x8000;
            *IDMA_SHORT_ADDR = dsp_last_sample;
            *IDMA_SHORT_ADDR = dsp_last_sample;
            dsp_last_sample = (read_data & 0xFF00) - 0x8000;   	
            *IDMA_SHORT_ADDR = dsp_last_sample;
            *IDMA_SHORT_ADDR = dsp_last_sample;
         }
         ihdl->mh.read += (DSP_FreeSeg >> 1);
      }
   } else {
      if (ihdl->pcmStrm.bitPerSample == 16) {
Esempio n. 4
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;
   }
}