static void libc_demo_pcm_output(struct pcm_output * pcm) { UINT8 pcm_frm_header[16]; UINT32 temp; static UINT32 avoid_under_run = 0; //config pcm frame header MEMSET(pcm_frm_header, 0, 16); if (pcm->samp_num&0x00000003) { //PRINTF("err sample num = %d \n",pcm->samp_num); return; } temp = pcm->samp_num; if (DAC_PRECISION == 16) temp = temp >> 1 ; pcm_frm_header[12] = ((UINT8*)(&temp))[0]; pcm_frm_header[13] = ((UINT8*)(&temp))[1]; if (SND_STATE_PLAY != g_snd_dev->flags && 0 == avoid_under_run) { if (RET_SUCCESS != snd_config(g_snd_dev, snd_samplerate, pcm->samp_num, DAC_PRECISION)) return; snd_write_pcm_data(g_snd_dev, pcm, (UINT32*)pcm_frm_header); avoid_under_run = 5; return; } if (0 != avoid_under_run) { snd_write_pcm_data(g_snd_dev, pcm, (UINT32*)pcm_frm_header); avoid_under_run--; if (0 == avoid_under_run) snd_start(g_snd_dev); return; } while (RET_SUCCESS != snd_request_pcm_buff(g_snd_dev, pcm->samp_num)) { //PRINTF("snd dev not enough PCM buffer.\n"); osal_task_sleep(10); } snd_write_pcm_data(g_snd_dev, pcm, (UINT32*)pcm_frm_header); if (RET_SUCCESS != snd_data_enough(g_snd_dev)) { snd_write_pcm_data(g_snd_dev, pcm, (UINT32*)pcm_frm_header); snd_write_pcm_data(g_snd_dev, pcm, (UINT32*)pcm_frm_header); } return ; }
static void low_sprt_ogg_output(struct snd_device * sound_dev, struct pcm_output * pcm) { // struct deca_s3601_private *priv=(struct deca_s3601_private*)sound_dev->priv ; UINT16 pcm_frame_header[4]; UINT32 temp, stc ; UINT8 timeout; //config pcm frame header pcm_frame_header[0]=0 ; pcm_frame_header[1]=0 ; pcm_frame_header[2]=0 ; pcm_frame_header[3]=0 ; // write frame_len into frame header if(pcm->samp_num&0x00000003) { //DECA_PRINTF("err sample num = %d \n",pcm->samp_num); //DECA_ASSERT(0); goto CUR_FRM_FINISHED ; } if(pcm->ch_num<=2) { pcm_frame_header[0]=pcm->samp_num+1; } else if(pcm->ch_num==8) { pcm_frame_header[0]=pcm->samp_num*4+4; } else { ASSERT(0); } if( (SND_STATE_PLAY != sound_dev->flags) && (0 == ogg_avoid_under_run)) { UINT32 pcm_buf_frm_num; // DECA_PRINTF("audio mode %d len %d bit rate %d id %d layer %d\n", priv->aud_mode, priv->frm_len, priv->bitrate, priv->id, priv->layer); if(pcm->ch_num==1) sound_dev->hardware=2; else sound_dev->hardware = pcm->ch_num; if(RET_SUCCESS!=snd_config(sound_dev,ogg_dup_samplerate,pcm->samp_num,24)) { //DECA_PRINTF("Cfg aud h/w FAILED.\n"); goto CUR_FRM_FINISHED ; } snd_write_pcm_data(sound_dev,pcm, (UINT32*)pcm_frame_header); ogg_avoid_under_run = 5; if(0==ogg_avoid_under_run) snd_start(sound_dev); //DECA_PRINTF("preserve %d pcm frm\n", priv->avoid_under_run+1); goto CUR_FRM_FINISHED ; } if(0!=ogg_avoid_under_run) { //DECA_PRINTF("priv->avoid_under_run is not 0 ! \r\n"); snd_write_pcm_data(sound_dev, pcm, (UINT32*)pcm_frame_header); ogg_avoid_under_run--; if(0==ogg_avoid_under_run)snd_start(sound_dev); goto CUR_FRM_FINISHED ; } while(RET_SUCCESS!=snd_request_pcm_buff(sound_dev, pcm_frame_header[0])) { osal_task_sleep(24); } snd_write_pcm_data(sound_dev, pcm, (UINT32*)pcm_frame_header); CUR_FRM_FINISHED : return ; }