码迷,mamicode.com
首页 > 其他好文 > 详细

QNX的音频应用实例

时间:2016-05-12 18:34:37      阅读:201      评论:0      收藏:0      [点我收藏+]

标签:

一.概述

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的音频应用实例

标签:

原文地址:http://blog.csdn.net/xiaoxiaopengbo/article/details/51353954

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!