[開發記錄] 函式庫調用 - 使用ALSA進行音訊資料擷取 之其一

目前打算使用ALSA進行資料擷取,

關於ALSA API所搜尋到的網路資料( http://equalarea.com/paul/alsa-audio.html ),

其中有一段 Mini Capture程式,並作了些許修改,如底下所示:


//---------------ALSA 測試程式---------------
#include <stdio.h>
#include <stdlib.h>
#include <alsa/asoundlib.h>
      
int main (int argc, char *argv[])
{
	int i;
	int err;

	unsigned int sample_rate;
	int sample_dir;

	int size;
	snd_pcm_uframes_t frames;
	char *buf;
	snd_pcm_t *capture_handle;
	snd_pcm_hw_params_t *hw_params;

	if ((err = snd_pcm_open(&capture_handle, argv[1], SND_PCM_STREAM_CAPTURE, 0)) < 0) {
		fprintf (stderr, "cannot open audio device %s (%s)\n", 
			 argv[1],
			 snd_strerror (err));
		exit(1);
	}	printf("open OK!\n");
	   
	if ((err = snd_pcm_hw_params_malloc(&hw_params)) < 0) {
		fprintf (stderr, "cannot allocate hardware parameter structure (%s)\n",
			 snd_strerror (err));
		exit(1);
	}	printf("set allocation OK!\n");

			 
	if ((err = snd_pcm_hw_params_any(capture_handle, hw_params)) < 0) {
		fprintf (stderr, "cannot initialize hardware parameter structure (%s)\n",
			 snd_strerror (err));
		exit(1);
	}	printf("set para OK!\n");

	if ((err = snd_pcm_hw_params_set_access(capture_handle, hw_params, SND_PCM_ACCESS_RW_INTERLEAVED)) < 0) {
		fprintf (stderr, "cannot set access type (%s)\n",
			 snd_strerror (err));
		exit(1);
	}	printf("set access OK!\n");

	if ((err = snd_pcm_hw_params_set_format(capture_handle, hw_params, SND_PCM_FORMAT_S16_LE)) < 0) {
		fprintf (stderr, "cannot set sample format (%s)\n",
			 snd_strerror (err));
		exit(1);
	}	printf("set sample format OK!\n");

	sample_rate=44100;	
	sample_dir=0;
	//snd_pcm_hw_params_set_rate_near (snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir) 
	if ((err = snd_pcm_hw_params_set_rate_near(capture_handle, hw_params, &sample_rate, &sample_dir)) < 0) {
		fprintf (stderr, "cannot set sample rate (%s)\n",
			 snd_strerror (err));
		exit(1);
	}	printf("set sample rate OK!\n");

	if ((err = snd_pcm_hw_params_set_channels(capture_handle, hw_params, 2)) < 0) {
		fprintf (stderr, "cannot set channel count (%s)\n",
			 snd_strerror (err));
		exit(1);
	}	printf("set channel OK!\n");

	if ((err = snd_pcm_hw_params(capture_handle, hw_params)) < 0) {
		fprintf (stderr, "cannot set parameters (%s)\n",
			 snd_strerror (err));
		exit(1);
	}	printf("set para OK!\n");

	snd_pcm_hw_params_free(hw_params);

	if ((err = snd_pcm_prepare (capture_handle)) < 0) {
		fprintf (stderr, "cannot prepare audio interface for use (%s)\n",
			 snd_strerror (err));
		exit(1);
	}	printf("prepare audio interface OK!\n");

	frames=128;
	size=frames*4;
	buf=(char*)malloc(size);
	for (i = 0; i < 10; ++i) {
		//snd_pcm_readi(snd_pcm_t *pcm,void *buffer,snd_pcm_uframes_t size)
		if ((err = snd_pcm_readi (capture_handle, buf, 128)) != 128) {
			fprintf (stderr, "read from audio interface failed (%s)\n",
				 snd_strerror (err));
			exit (1);
		}	
	}
	free(buf);
	snd_pcm_close (capture_handle);
	printf("end of Mini-Capture!\n");
	exit (0);
}

在編輯時遭遇零件庫問題,直接將 linux-devkit/arm-none-linux-guneabi/usr/include以及lib都複製到 CodeSourcery/Sourcery_G++_Lite/arm-none-linux-guneabi/相對應的資料夾,解決!

使用 gcc時,需要指定使用 -lasound 函式庫。

程式內,部分增加註解的地方,是由於函式庫的參數錯誤,出現Segmentation fail的訊息,修改參數類型後重新編譯,

在BBxM內,執行./MiniCapture default 指定設備使用default值,就可進行截取聲音訊號的工作,

內部參數的設定意義,等我了解後在另外補上。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值