Ⅰ 我想問一下pcm格式用哪種播放器
PCM格式的文件是指模擬音頻信號經模數轉換直接形成的二進制序列,需要用linuxBlueZPCM音頻播放器進行播放。
通常指的播放器是指能播放以數字信號形式存儲的視頻或音頻文件的軟體,也指具有播放視頻或音頻文件功能的電子器件產品。如基於快閃記憶體的mp3播放器和基於移動硬碟的iPod等。除了少數波形文件外,大多數播放器攜帶解碼器以還原經過壓縮媒體文件,播放器還要內置一整套轉換頻率以及緩沖的演算法。以前是播放音頻和視頻的軟體各具特色,現在大多則是視頻音頻播放器合二為一了。衡量一款播放器軟體的好壞可以從內核、交互界面和播放模式三方面入手。內核主要指解碼、緩沖、頻率轉換等諸多涉及音質的演算法,交互界面主要指用戶與軟體交互的外部介面,播放模式主要指播放器以何種方式播放哪些歌曲以滿足用戶對播放習慣和播放心理。內核、交互界面、播放模式三方面在播放器設計中受重視的程度依次遞減。以至大多數播放器的播放模式都很類似。
更多關於pcm格式用哪種播放器,進入:https://m.abcgonglue.com/ask/6ef1d61615837747.html?zd查看更多內容
Ⅱ Linux下Alsa編程 snd_pcm_open函數返回-111,說是 connect refused,這是為什麼啊
提示連接被拒絕,
1,首先需要確認你的音效卡驅動是否正常,
2,確認函數參數是否正確
3,確認構建配置樹是否配置成功
由於提主提供的資料有限,沒法提供更多建議!
Ⅲ 有什麼軟體能播放PCM的音頻文件嗎
PCM文件:
模擬音頻信號經模數轉換(A/D變換)直接形成的二進制序列,該文件沒有回附加的答文件頭和文件結束標志。Windows的Convert工具可以把PCM音頻格式的文件轉換成Microsoft的WAV格式的文件。
All To MP3 Converter 1.6 漢化版 可將WMA,OGG和WAV PCM WMA格式轉換成MP3格式.
Ⅳ 怎麼使用libmad
所幸手裡有Altera公司的一個工程,藉助對該工程的分析、minimad.c中少的可憐的注釋和網上搜索的Linux音頻方面的相關知識,反復思考編碼,總算把libmad庫用起來了,現記錄一下其使用方法,在幫助別人的同時也方便自己回頭查詢。在開始之前,最好先把mp3文件格式和Linux音頻編程方面的知識先學習一下,不然後面有的東西可能聽不懂,還有就是一定要熟悉Linux系統,後面的代碼都是在linux系統中用gcc編譯的,在Windows下不能用的。首先看下面幾個問題,這也是我一開始最迷惑的,弄明白這幾個問題了,也就對libmad庫的使用相當熟悉了: minimad.c怎麼編譯?編譯後怎麼運行?運行時的輸入輸出分別是什麼,或者說運行時什麼效果?怎樣播放minimad輸出的數據?或者說怎麼播放解碼後的數據?minimad運行時,mp3數據來源是標准輸入,能不能改為從文件中讀入數據?該怎麼改?minimad運行時首先要將整個mp3文件讀入內存,能不能改成邊解碼邊讀入的形式,比如每次讀入16K,解碼完再讀入16K,而又不影響播放的連貫性,這樣可以節省內存開銷,方便在嵌入式系統中使用;怎樣用libmad做一個簡單的mp3播放器? 一個一個來講吧。 #include #include #include #include #include #include #include #include #include #include "mad.h" #define BUFSIZE 8192 /* * This is a private message structure. A generic pointer to this structure * is passed to each of the callback functions. Put here any data you need * to access from within the callbacks. */ struct buffer { FILE *fp; /*file pointer*/ unsigned int flen; /*file length*/ unsigned int fpos; /*current position*/ unsigned char fbuf[BUFSIZE]; /*buffer*/ unsigned int fbsize; /*indeed size of buffer*/ }; typedef struct buffer mp3_file; int soundfd; /*soundcard file*/ unsigned int prerate = 0; /*the pre simple rate*/ int writedsp(int c) { return write(soundfd, (char *)&c, 1); } void set_dsp() { int format = AFMT_S16_LE; int channels = 2; soundfd = open("/dev/dsp", O_WRONLY); ioctl(soundfd, SNDCTL_DSP_SETFMT, &format); ioctl(soundfd, SNDCTL_DSP_CHANNELS, &channels); } /* * This is perhaps the simplest example use of the MAD high-level API. * Standard input is mapped into memory via mmap(), then the high-level API * is invoked with three callbacks: input, output, and error. The output * callback converts MAD's high-resolution PCM samples to 16 bits, then * writes them to standard output in little-endian, stereo-interleaved * format. */ static int decode(mp3_file *mp3fp); int main(int argc, char *argv[]) { long flen, fsta, fend; int dlen; mp3_file *mp3fp; if (argc != 2) return 1; mp3fp = (mp3_file *)malloc(sizeof(mp3_file)); if((mp3fp->fp = fopen(argv[1], "r")) == NULL) { printf("can't open source file.\n"); return 2; } fsta = ftell(mp3fp->fp); fseek(mp3fp->fp, 0, SEEK_END); fend = ftell(mp3fp->fp); flen = fend - fsta; if(flen fp, 0, SEEK_SET); fread(mp3fp->fbuf, 1, BUFSIZE, mp3fp->fp); mp3fp->fbsize = BUFSIZE; mp3fp->fpos = BUFSIZE; mp3fp->flen = flen; set_dsp(); decode(mp3fp); close(soundfd); fclose(mp3fp->fp); return 0; } /* * This is the input callback. The purpose of this callback is to (re)fill * the stream buffer which is to be decoded. In this example, an entire file * has been mapped into memory, so we just call mad_stream_buffer() with the * address and length of the mapping. When this callback is called a second * time, we are finished decoding. */ static enum mad_flow input(void *data, struct mad_stream *stream) { mp3_file *mp3fp; int ret_code; int unproc_data_size; /*the unprocessed data's size*/ int _size; mp3fp = (mp3_file *)data; if(mp3fp->fpos flen) { unproc_data_size = stream->bufend - stream->next_frame; memcpy(mp3fp->fbuf, mp3fp->fbuf+mp3fp->fbsize-unproc_data_size, unproc_data_size); _size = BUFSIZE - unproc_data_size; if(mp3fp->fpos + _size > mp3fp->flen) { _size = mp3fp->flen - mp3fp->fpos; } fread(mp3fp->fbuf+unproc_data_size, 1, _size, mp3fp->fp); mp3fp->fbsize = unproc_data_size + _size; mp3fp->fpos += _size; /*Hand off the buffer to the mp3 input stream*/ mad_stream_buffer(stream, mp3fp->fbuf, mp3fp->fbsize); ret_code = MAD_FLOW_CONTINUE; } else { ret_code = MAD_FLOW_STOP; } return ret_code; } /* * The following utility routine performs simple rounding, clipping, and * scaling of MAD's high-resolution samples down to 16 bits. It does not * perform any dithering or noise shaping, which would be recommended to * obtain any exceptional audio quality. It is therefore not recommended to * use this routine if high-quality output is desired. */ static inline signed int scale(mad_fixed_t sample) { /* round */ sample += (1L <= MAD_F_ONE) sample = MAD_F_ONE - 1; else if (sample > (MAD_F_FRACBITS + 1 - 16); } /* * This is the output callback function. It is called after each frame of * MPEG audio data has been completely decoded. The purpose of this callback * is to output (or play) the decoded PCM audio. */ static enum mad_flow output(void *data, struct mad_header const *header, struct mad_pcm *pcm) { unsigned int nchannels, nsamples; unsigned int rate; mad_fixed_t const *left_ch, *right_ch; /* pcm->samplerate contains the sampling frequency */ rate= pcm->samplerate; nchannels = pcm->channels; nsamples = pcm->length; left_ch = pcm->samples[0]; right_ch = pcm->samples[1]; /* update the sample rate of dsp*/ if(rate != prerate) { ioctl(soundfd, SNDCTL_DSP_SPEED, &rate); prerate = rate; } while (nsamples--) { signed int sample; /* output sample(s) in 16-bit signed little-endian PCM */ sample = scale(*left_ch++); writedsp((sample >> 0) & 0xff); writedsp((sample >> 8) & 0xff); if (nchannels == 2) { sample = scale(*right_ch++); writedsp((sample >> 0) & 0xff); writedsp((sample >> 8) & 0xff); } } return MAD_FLOW_CONTINUE; } /* * This is the error callback function. It is called whenever a decoding * error occurs. The error is indicated by stream->error; the list of * possible MAD_ERROR_* errors can be found in the mad.h (or stream.h) * header file. */ static enum mad_flow error(void *data, struct mad_stream *stream, struct mad_frame *frame) { mp3_file *mp3fp = data; fprintf(stderr, "decoding error 0x%04x (%s) at byte offset %u\n", stream->error, mad_stream_errorstr(stream), stream->this_frame - mp3fp->fbuf); /* return MAD_FLOW_BREAK here to stop decoding (and propagate an error) */ return MAD_FLOW_CONTINUE; } /* * This is the function called by main() above to perform all the decoding. * It instantiates a decoder object and configures it with the input, * output, and error callback functions above. A single call to * mad_decoder_run() continues until a callback function returns * MAD_FLOW_STOP (to stop decoding) or MAD_FLOW_BREAK (to stop decoding and * signal an error). */ static int decode(mp3_file *mp3fp) { struct mad_decoder decoder; int result; /* configure input, output, and error functions */ mad_decoder_init(&decoder, mp3fp, input, 0 /* header */, 0 /* filter */, output, error, 0 /* message */); /* start decoding */ result = mad_decoder_run(&decoder, MAD_DECODER_MODE_SYNC); /* release the decoder */ mad_decoder_finish(&decoder); return result; }分享到:
Ⅳ pcm格式音頻 linux下是什麼意思
PCM是一種編碼格式,WAV是一種文件格式。
對於WAV來說,只要符合RIFF規范,由一個符合格式的「頭」和大量「數據塊」按要求組成文件就可以了。它並沒有詳細規定數據塊中的數據採用哪種編碼。
保存為WAV文件的音頻可以有多種編碼格式,既可以是PCM也可以是ADPCM、A-Law、u-Law等等。常見的WAV可用編碼格式還有:IEEE浮點、GSM6.1甚至MpegLayer-3。沒錯,就是MP3。
所有,有時會看到這個WAV能播放,另一不能播放,但是換一台電腦又可以播放了的情況。這是因為第一台電腦上沒有安裝對應的解碼器。
Ⅵ linux下c程序執行時播放音樂
/**
*test.c
*
*注意:這個例子在Ubuntu12.04.1環境下編譯運行成功。
*
*/
#include<stdio.h>
#include<stdlib.h>
#include<alsa/asoundlib.h>
intmain(intargc,char*argv[])
{
inti;
intret;
intbuf[128];
unsignedintval;
intdir=0;
char*buffer;
intsize;
snd_pcm_uframes_tframes;
snd_pcm_uframes_tperiodsize;
snd_pcm_t*playback_handle;//PCM設備句柄pcm.h
snd_pcm_hw_params_t*hw_params;//硬體信息和流配置
if(argc!=2){
printf("error:alsa_play_test[musicname] ");
exit(1);
}
printf("playsong%sbywolf ",argv[1]);
FILE*fp=fopen(argv[1],"rb");
if(fp==NULL)
return0;
fseek(fp,100,SEEK_SET);
//1.打開PCM,最後一個參數為0意味著標准配置
ret=snd_pcm_open(&playback_handle,"default",SND_PCM_STREAM_PLAYBACK,0);
if(ret<0){
perror("snd_pcm_open");
exit(1);
}
//2.分配snd_pcm_hw_params_t結構體
ret=snd_pcm_hw_params_malloc(&hw_params);
if(ret<0){
perror("snd_pcm_hw_params_malloc");
exit(1);
}
//3.初始化hw_params
ret=snd_pcm_hw_params_any(playback_handle,hw_params);
if(ret<0){
perror("snd_pcm_hw_params_any");
exit(1);
}
//4.初始化訪問許可權
ret=snd_pcm_hw_params_set_access(playback_handle,hw_params,SND_PCM_ACCESS_RW_INTERLEAVED);
if(ret<0){
perror("snd_pcm_hw_params_set_access");
exit(1);
}
//5.初始化采樣格式SND_PCM_FORMAT_U8,8位
ret=snd_pcm_hw_params_set_format(playback_handle,hw_params,SND_PCM_FORMAT_U8);
if(ret<0){
perror("snd_pcm_hw_params_set_format");
exit(1);
}
//6.設置采樣率,如果硬體不支持我們設置的采樣率,將使用最接近的
//val=44100,有些錄音采樣頻率固定為8KHz
val=8000;
ret=snd_pcm_hw_params_set_rate_near(playback_handle,hw_params,&val,&dir);
if(ret<0){
perror("snd_pcm_hw_params_set_rate_near");
exit(1);
}
//7.設置通道數量
ret=snd_pcm_hw_params_set_channels(playback_handle,hw_params,2);
if(ret<0){
perror("snd_pcm_hw_params_set_channels");
exit(1);
}
/*Setperiodsizeto32frames.*/
frames=32;
periodsize=frames*2;
ret=snd_pcm_hw_params_set_buffer_size_near(playback_handle,hw_params,&periodsize);
if(ret<0)
{
printf("Unabletosetbuffersize%li:%s ",frames*2,snd_strerror(ret));
}
periodsize/=2;
ret=snd_pcm_hw_params_set_period_size_near(playback_handle,hw_params,&periodsize,0);
if(ret<0)
{
printf("Unabletosetperiodsize%li:%s ",periodsize,snd_strerror(ret));
}
//8.設置hw_params
ret=snd_pcm_hw_params(playback_handle,hw_params);
if(ret<0){
perror("snd_pcm_hw_params");
exit(1);
}
/**/
snd_pcm_hw_params_get_period_size(hw_params,&frames,&dir);
size=frames*2;/*2bytes/sample,2channels*/
buffer=(char*)malloc(size);
fprintf(stderr,
"size=%d ",
size);
while(1)
{
ret=fread(buffer,1,size,fp);
if(ret==0)
{
fprintf(stderr,"endoffileoninput ");
break;
}
elseif(ret!=size)
{
}
//9.寫音頻數據到PCM設備
while(ret=snd_pcm_writei(playback_handle,buffer,frames)<0)
{
usleep(2000);
if(ret==-EPIPE)
{
/*EPIPEmeansunderrun*/
fprintf(stderr,"underrunoccurred ");
//完成硬體參數設置,使設備准備好
snd_pcm_prepare(playback_handle);
}
elseif(ret<0)
{
fprintf(stderr,
"errorfromwritei:%s ",
snd_strerror(ret));
}
}
}
//10.關閉PCM設備句柄
snd_pcm_close(playback_handle);
return0;
}
//注意:編譯的時候應該保持「gcc-otesttest.c-L.-lasound」的格式,運行的時候應該保持"./test//clip2.wav"這種格式。
Ⅶ 矩聲element系列區別
矩聲element系列區別如下:
element-i:
1、element-i採用了FREESCALE I.MX6 系列雙核ARM處理器作為主控核心,事實上此時在機器內部軟硬體結合的非常好,不同切換非常順滑。
2、解碼部分使用了ESS的9028Pro晶元——這是一款規格非常不錯的晶元,調好了可以有著很大的聲音表現——事實證明矩聲這一次對這塊晶元的發掘非常到位,看來在周邊電路的設計上下了很大的功夫。
3、這款遙控器除了基礎的音量控制,還能切換不同的輸入源,非常便捷;還能直接切換濾波方案,可以微調聲音,在調試新喇叭時候這一個功能可以說非常方便了。
element-x:
1、Element X前面板有兩個單端和一個平衡耳放輸出口。耳放電路由獨立4通道放大單元組成,是用美國TI LME49600高精度運放構成的雙模式耳機放大器。
2、右邊的電位器為多用途旋鈕,按下可以啟動設定中間顯示器中的多個選項,旋動則可以控制耳放輸出和前級輸出。Element X內置了高素質的模擬電路前級放大器,具有+10dB的模擬增益以對應不同的輸入需求。深耕DAC和耳放產品多年的矩聲清楚傳統碳膜電位器和數字音量的弊端,這個電位器的背後是矩聲設計的由繼電器陣列和DAC晶元內部的數字音量單元組成的混合式音量控制,融合模擬音量控制和數字音量控制,既保留模擬音量的優良音質,又具有數字音量的精準控制。
3、從背面的接插口就可以看出Element X豐富的玩法功能。輸入方麵包括有線/WIFI網路、USB Audio、USB儲存、IIS HDMI以及傳統的光纖和同軸;輸出方面則為一組XLR平衡以及一組RCA單端。
4、Element X搭載Freescale i.MX6四核ARM處理器,音頻播放平台是基於Linux平台,可以流暢玩遍網路流媒體和本地文件播放功能。除了有線數字信號接入和掛載USB/NAS儲存設備,用戶可以通過AirPlay/DLNA直接推流,也可以通過ROON或者自家MA Player App接入多家流媒體平台,實現了真正的音源自由。
5、強大的ARM處理器配合以ESS ES9038PRO為核心的D/A電路,這台機器可以支持高達32Bit/768kHz的PCM和22.4MHz的DSD格式,時下流行的MQA格式也能完全展開解碼。配合這顆ESS的旗艦DAC晶元,Element X搭配了專用的超低噪音ES9311線性電源晶元,Crystek CCHD-950超低相噪飛秒時鍾。對應USB Audio的用戶,矩聲則使用了XMOS XU216方案。
Ⅷ 請教Linux下ALSA聲道切換
解各參數含義及些基本概念
本度(sample):本記錄音頻數據基本單位見8位16位
通道數(channel):該參數1表示單聲道2則立體聲
楨(frame):楨記錄聲音單元其度本度與通道數乘積
采率(rate):每秒鍾采數該數針楨言
周期(period):音頻設備處理所需要楨數於音頻設備數據訪問及音頻數據存儲都單位
交錯模式(interleaved):種音頻數據記錄式交錯模式數據連續楨形式存放即首先記錄完楨1左聲道本右聲道本(假設立體聲格式)再始楨2記錄非交錯模式首先記錄周期內所楨左聲道本再記錄右聲道本數據連續通道式存儲數情況我需要使用交錯模式
period(周期):硬體斷間間隔間表示輸入延
音效卡介面指針指示音效卡硬體緩存區前讀寫位置要介面運行指針循環指向緩存區某位置
frame size = sizeof(one sample) * nChannels
alsa配置緩存(buffer)周期(size)runtime幀(frames)形式存儲
period_bytes = frames_to_bytes(runtime, runtime->period_size);
bytes_to_frames()
The period and buffer sizes are not dependent on the sample format because they are measured in frames; you do not need to change them.
ALSA聲音編程介紹
ALSA表示高級Linux聲音體系結構(Advanced Linux Sound Architecture)由系列內核驅應用程序編譯介面(API)及支持Linux聲音實用程序組篇文章我簡單介紹ALSA項目基本框架及軟體組主要集介紹PCM介面編程包括您自實踐程序示例
您使用ALSA原能新並唯用聲音API您想完低級聲音操作便能夠化控制聲音並化提高性能或者您使用其聲音API沒特性ALSA選擇您已經寫音頻程序能想要ALSA音效卡驅添加本支持您音頻興趣想播放音頻文件高級API更選擇比SDL,OpenAL及些桌面環境提供工具集另外您能ALSA支持Linux環境使用ALSA
ALSA歷史
ALSA項目發起起Linux音效卡驅(OSS/Free drivers)沒積極維護並且落於新音效卡技術Jaroslav Kysela早先寫音效卡驅並由始ALSA項目隨便更發者加入發隊伍更音效卡支持API結構重組
Linux內核2.5發程ALSA合並官源碼樹發布內核2.6ALSA已經內建穩定內核版本並廣泛使用
數字音頻基礎
聲音由變化氣壓組麥克風轉換器轉換電形式模/數(ADC)轉換器模擬電壓轉換離散本值聲音固定間間隔采采速率稱采率本輸數/模(DAC)轉換器比擴音器轉換原模擬信號
本位表示本影響聲音轉換數字信號精確程度素另主要素采率奈奎斯特(Nyquist)理論要離散系統奈奎斯特頻率高於採信號高頻率或帶寬避免混疊現象
ALSA基礎
ALSA由許音效卡音效卡驅程序組同提供稱libasoundAPI庫應用程序發者應該使用libasound內核ALSA介面libasound提供高級並且編程便編程介面並且提供設備邏輯命名功能發者甚至需要知道類似設備文件低層介面相反OSS/Free驅內核系統調用級編程要求發者提供設備文件名並且利用ioctrl實現相應功能向兼容ALSA提供內核模塊模擬OSS前許OSS基礎發應用程序需要任何改ALSA運行另外libaoss庫模擬OSS需要內核模塊
ALSA包含插件功能使用插件擴展新音效卡驅包括完全用軟體實現虛擬音效卡ALSA提供系列基於命令行工具集比混音器(mixer)音頻文件播放器(aplay)及控制特定音效卡特定屬性工具
ALSA體系結構
ALSA API解幾主要介面:
1 控制介面:提供管理音效卡注冊請求用設備通用功能
2 PCM介面:管理數字音頻放(playback)錄音(capture)介面本文續總結重點放介面發數字音頻程序用介面
3 Raw MIDI介面:支持MIDI(Musical Instrument Digital Interface),標准電樂器些API提供音效卡MIDI匯流排訪問原始介面基於MIDI事件工作由程序員負責管理協議及間處理
4 定器(Timer)介面:同步音頻事件提供音效卡間處理硬體訪問
5 序器(Sequencer)介面
6 混音器(Mixer)介面
設備命名
API庫使用邏輯設備名設備文件設備名字真實硬體名字插件名字硬體名字使用hw:i,j格式其i卡號j塊音效卡設備號第聲音設備hw:0,0.別名默認引用第塊聲音設備並且本文示例真用插件使用另外唯名字比plughw:,表示插件插件提供硬體設備訪問提供像采率轉換軟體特性硬體本身並支持特性
聲音緩存數據傳輸
每音效卡都硬體緩存區保存記錄本緩存區足夠滿音效卡產斷內核音效卡驅使用直接內存(DMA)訪問通道本傳送內存應用程序緩存區類似於放任何應用程序使用DMA自緩存區數據傳送音效卡硬體緩存區
硬體緩存區環緩存說數據達緩存區末尾重新緩存區起始位置ALSA維護指針指向硬體緩存及應用程序緩存區數據操作前位置內核外部看我應用程序緩存區興趣所本文討論應用程序緩存區
應用程序緩存區通ALSA庫函數調用控制緩存區傳輸操作能導致接受延遲我稱延(latency)解決問題ALSA緩存區拆系列周期(period)(OSS/Free叫片斷fragments).ALSAperiod單元傳送數據
周期(period)存儲些幀(frames)每幀包含間點所抓取本於立體聲設備幀包含兩信道本圖1展示解程:緩存區解周期幀本圖包含些假定數值圖左右信道信息交替存儲幀內稱交錯(interleaved)模式非交錯模式信道所本數據存儲另外信道數據
Over and Under Run
音效卡數據總連續硬體緩存區應用程序緩存區間傳輸例外錄音例應用程序讀取數據夠快循環緩存區新數據覆蓋種數據丟失稱overrun.放例應用程序寫入數據緩存區速度夠快緩存區"餓死"錯誤稱"underrun"ALSA文檔兩種情形統稱"XRUN"適設計應用程序化XRUN並且恢復
典型聲音程序
使用PCM程序通類似面偽代碼:
打放或錄音介面
設置硬體參數(訪問模式數據格式信道數采率等等)
while 數據要處理:
讀PCM數據(錄音)
或 寫PCM數據(放)
關閉介面
我文看些工作代碼我建議您Linux系統測試運行些代碼查看輸並嘗試修改推薦代碼本文相關所實例清單FTP獲取:ftp.ssc.com/pub/lj/listings/issue126/6735.tgz
Listing 1. Display Some PCM Types and Formats
#include asoundlib.h>
int main() {
int val;
printf("ALSA library version: %s/n",
SND_LIB_VERSION_STR);
printf("/nPCM stream types:/n");
for (val = 0; val <= SND_PCM_STREAM_LAST; val++)
printf(" %s/n",
snd_pcm_stream_name((snd_pcm_stream_t)val));
printf("/nPCM access types:/n");
for (val = 0; val <= SND_PCM_ACCESS_LAST; val++)
printf(" %s/n",
snd_pcm_access_name((snd_pcm_access_t)val));
printf("/nPCM formats:/n");
for (val = 0; val <= SND_PCM_FORMAT_LAST; val++)
if (snd_pcm_format_name((snd_pcm_format_t)val)
!= NULL)
printf(" %s (%s)/n",
snd_pcm_format_name((snd_pcm_format_t)val),
snd_pcm_format_description(
(snd_pcm_format_t)val));
printf("/nPCM subformats:/n");
for (val = 0; val <= SND_PCM_SUBFORMAT_LAST;
val++)
printf(" %s (%s)/n",
snd_pcm_subformat_name((
snd_pcm_subformat_t)val),
snd_pcm_subformat_description((
snd_pcm_subformat_t)val));
printf("/nPCM states:/n");
for (val = 0; val <= SND_PCM_STATE_LAST; val++)
printf(" %s/n",
snd_pcm_state_name((snd_pcm_state_t)val));
return 0;
}
清單顯示些ALSA使用PCM數據類型參數首先需要做包括文件些文件包含所庫函數聲明其顯示ALSA庫版本
程序剩部迭代些PCM數據類型流類型始ALSA每迭代值提供符號量名並且提供功能函數顯示某特定值描述字元串看ALSA支持許格式我1.0.15版本支持達36種格式
程序必須鏈接alsalib庫通編譯需要加-lasound選項些alsa庫函數使用dlopen函數及浮點操作所您能需要加-ldl,-lm選項
面該程序Makefile:
CC=gcc
TARGET=test
SRC=$(wildcard *.c)
OBJECT= ${SRC:.c=.o}
INCLUDES=-I/usr/include/alsa
LDFLAGS=-lasound
all:$(TARGET)
$(OBJECT):$(SRC)
$(CC) -c $(INCLUDES) $<
$(TARGET):$(OBJECT)
$(CC) -o $@ $< $(LDFLAGS)
.PHONY:clean
clean:
@rm -rf $(OBJECT) $(TARGET) *~
Listing 2. Opening PCM Device and Setting Parameters
/*
This example opens the default PCM device, sets
some parameters, and then displays the value
of most of the hardware parameters. It does not
perform any sound playback or recording.
*/
/* Use the newer ALSA API */
#define ALSA_PCM_NEW_HW_PARAMS_API
/* All of the ALSA library API is defined
* in this header */
#include asoundlib.h>
int main() {
int rc;
snd_pcm_t *handle;
snd_pcm_hw_params_t *params;
unsigned int val, val2;
int dir;
snd_pcm_uframes_t frames;
/* Open PCM device for playback. */
rc = snd_pcm_open(&handle, "default",
SND_PCM_STREAM_PLAYBACK, 0);
if (rc < 0) {
fprintf(stderr,
"unable to open pcm device: %s/n",
snd_strerror(rc));
exit(1);
}
/* Allocate a hardware parameters object. */
snd_pcm_hw_params_alloca(?ms);
/* Fill it in with default values. */
snd_pcm_hw_params_any(handle, params);
/* Set the desired hardware parameters. */
/* Interleaved mode */
snd_pcm_hw_params_set_access(handle, params,
SND_PCM_ACCESS_RW_INTERLEAVED);
/* Signed 16-bit little-endian format */
snd_pcm_hw_params_set_format(handle, params,
SND_PCM_FORMAT_S16_LE);
/* Two channels (stereo) */
snd_pcm_hw_params_set_channels(handle, params, 2);
/* 44100 bits/second sampling rate (CD quality) */
val = 44100;
snd_pcm_hw_params_set_rate_near(handle,
params, &val, &dir);
/* Write the parameters to the driver */
rc = snd_pcm_hw_params(handle, params);
if (rc < 0) {
fprintf(stderr,
"unable to set hw parameters: %s/n",
snd_strerror(rc));
exit(1);
}
/* Display information about the PCM interface */
printf("PCM handle name = '%s'/n",
snd_pcm_name(handle));
printf("PCM state = %s/n",
snd_pcm_state_name(snd_pcm_state(handle)));
snd_pcm_hw_params_get_access(params,
(snd_pcm_access_t *) &val);
printf("access type = %s/n",
snd_pcm_access_name((snd_pcm_access_t)val));
snd_pcm_hw_params_get_format(params, &val);
printf("format = '%s' (%s)/n",
snd_pcm_format_name((snd_pcm_format_t)val),
snd_pcm_format_description(
(snd_pcm_format_t)val));
snd_pcm_hw_params_get_subformat(params,
(snd_pcm_subformat_t *)&val);
printf("subformat = '%s' (%s)/n",
snd_pcm_subformat_name((snd_pcm_subformat_t)val),
snd_pcm_subformat_description(
(snd_pcm_subformat_t)val));
snd_pcm_hw_params_get_channels(params, &val);
printf("channels = %d/n", val);
snd_pcm_hw_params_get_rate(params, &val, &dir);
printf("rate = %d bps/n", val);
snd_pcm_hw_params_get_period_time(params,
&val, &dir);
printf("period time = %d us/n", val);
snd_pcm_hw_params_get_period_size(params,
&frames, &dir);
printf("period size = %d frames/n", (int)frames);
snd_pcm_hw_params_get_buffer_time(params,
&val, &dir);
printf("buffer time = %d us/n", val);
snd_pcm_hw_params_get_buffer_size(params,
(snd_pcm_uframes_t *) &val);
printf("buffer size = %d frames/n", val);
snd_pcm_hw_params_get_periods(params, &val, &dir);
printf("periods per buffer = %d frames/n", val);
snd_pcm_hw_params_get_rate_numden(params,
&val, &val2);
printf("exact rate = %d/%d bps/n", val, val2);
val = snd_pcm_hw_params_get_sbits(params);
printf("significant bits = %d/n", val);
snd_pcm_hw_params_get_tick_time(params,
&val, &dir);
printf("tick time = %d us/n", val);
val = snd_pcm_hw_params_is_batch(params);
printf("is batch = %d/n", val);
val = snd_pcm_hw_params_is_block_transfer(params);
printf("is block transfer = %d/n", val);
val = snd_pcm_hw_params_is_double(params);
printf("is double = %d/n", val);
val = snd_pcm_hw_params_is_half_plex(params);
printf("is half plex = %d/n", val);
val = snd_pcm_hw_params_is_joint_plex(params);
printf("is joint plex = %d/n", val);
val = snd_pcm_hw_params_can_overrange(params);
printf("can overrange = %d/n", val);
val = snd_pcm_hw_params_can_mmap_sample_resolution(params);
printf("can mmap = %d/n", val);
val = snd_pcm_hw_params_can_pause(params);
printf("can pause = %d/n", val);
val = snd_pcm_hw_params_can_resume(params);
printf("can resume = %d/n", val);
val = snd_pcm_hw_params_can_sync_start(params);
printf("can sync start = %d/n", val);
snd_pcm_close(handle);
return 0;
}