Example #1
0
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 ;
}
Example #2
0
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 ;
}