/*----------------------------------------------------------------------*/ 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; }
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; } }