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 ); }
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); } }
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) {
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; } }