QNX的音频应用实例

一.概述

QNX音频类似于linux,采用节点的方式,open,read,write

二.查看节点类型

ls -l /dev/snd/

结果:

-rw-rw-rw-   1 root      nto               0 Jan 01 00:07 controlC0
-rw-rw-rw-   1 root      nto               0 Jan 01 00:55 controlC1
-rw-rw-rw-   1 root      nto               0 Jan 01 00:55 controlC2
lrw-rw-rw-   1 root      nto               0 Jan 01 00:55 defaultc -> pcmC0D0c
lrw-rw-rw-   1 root      nto               0 Jan 01  1970 defaultp -> pcmC0D1p
-rw-rw-rw-   1 root      nto               0 Jan 01 00:07 mixerC0D0
-rw-rw-rw-   1 root      nto               0 Jan 01 00:55 mixerC1D0
-rw-rw-rw-   1 root      nto               0 Jan 01 00:55 mixerC2D0
-rw-rw-rw-   1 root      nto               0 Jan 01 00:07 pcmC0D0c
-rw-rw-rw-   1 root      nto               0 Jan 01 00:55 pcmC0D0p
-rw-rw-rw-   1 root      nto               0 Jan 01 00:07 pcmC0D1p
-rw-rw-rw-   1 root      nto               0 Jan 01 00:55 pcmC1D0c
-rw-rw-rw-   1 root      nto               0 Jan 01 00:55 pcmC1D0p
-rw-rw-rw-   1 root      nto               0 Jan 01 00:55 pcmC1D1p
-rw-rw-rw-   1 root      nto               0 Jan 01 00:55 pcmC2D0c
-rw-rw-rw-   1 root      nto               0 Jan 01 00:55 pcmC2D0p
-rw-rw-rw-   1 root      nto               0 Jan 01 00:55 pcmC2D1p
lrw-rw-rw-   1 root      nto               0 Jan 01 00:55 pcmNavigation -> pcmC2D1p
lrw-rw-rw-   1 root      nto               0 Jan 01 00:55 pcmPreferredc -> pcmC0D0c
lrw-rw-rw-   1 root      nto               0 Jan 01 00:55 pcmPreferredp -> pcmC0D1p

C结尾的是capture的,P结尾是playback,另外C2D1是只card 2, device 1

三.sample code

<span style="white-space:pre">	</span>snd_pcm_channel_info_t			info;
	snd_pcm_channel_params_t		params;
	snd_pcm_channel_setup_t			setup;
	snd_pcm_t *pcmHandle;

	ret = snd_pcm_open(&pcmHandle, card,device, input ? SND_PCM_OPEN_CAPTURE : SND_PCM_OPEN_PLAYBACK);

	if(ret == EOK)
	{
		printf("open success\n");
	}
	else
	{
		printf("open fault\n");
	}
	snd_pcm_plugin_set_disable( pcmHandle, PLUGIN_DISABLE_MMAP );

	memset( &info, 0, sizeof( info ) );
	info.channel = input ? SND_PCM_CHANNEL_CAPTURE : SND_PCM_CHANNEL_PLAYBACK;
	snd_pcm_plugin_info( pcmHandle, &info );

	memset( ¶ms, 0, sizeof( params ) );
	params.channel	= info.channel;
	params.mode		= SND_PCM_MODE_BLOCK;

	if( bits == 8 )
	{
		if( sign )			params.format.format = SND_PCM_SFMT_S8;
		else				params.format.format = SND_PCM_SFMT_U8;
	}
	else if( bits == 16 )
	{
		if( be && sign )	params.format.format = SND_PCM_SFMT_S16_BE;
		else if( be )		params.format.format = SND_PCM_SFMT_U16_BE;
		else if( sign )		params.format.format = SND_PCM_SFMT_S16_LE;
		else				params.format.format = SND_PCM_SFMT_U16_LE;
	}
	else if( bits == 24 )
	{
		if( be && sign )	params.format.format = SND_PCM_SFMT_S24_BE;
		else if( be )		params.format.format = SND_PCM_SFMT_U24_BE;
		else if( sign )		params.format.format = SND_PCM_SFMT_S24_LE;
		else				params.format.format = SND_PCM_SFMT_U24_LE;
	}

	params.format.interleave	= 1;
	params.format.rate			= rate;
	params.format.voices		= 1;
	params.start_mode			= SND_PCM_START_FULL;
	params.stop_mode			= SND_PCM_STOP_ROLLOVER;
	if (input)
	{
		params.buf.block.frag_size = params.format.rate * params.format.voices * sizeof(short) * 2 / 125;		// Enforce 16ms frag size
	} else {
		params.buf.block.frag_size = info.max_fragment_size;
	}
	params.buf.block.frags_max	= 2;
	params.buf.block.frags_min	= 1;

	snd_pcm_plugin_params( pcmHandle, ¶ms );

	snd_pcm_plugin_prepare( pcmHandle, info.channel );


	memset( &setup, 0, sizeof( setup ) );
	setup.channel	= info.channel;
	snd_pcm_plugin_setup( pcmHandle, &setup );

最后再执行read或者write动作

snd_pcm_plugin_read( arg->pcmHandleIn1, arg->audioBufferOut, arg->audioMaxLenOut );
snd_pcm_plugin_write( arg->pcmHandleOut1, arg->audioBufferOut, arg->audioMaxLenOut);


你可能感兴趣的:(QNX音频)