ALSA【一】

ALSA是Advanced Linux Sound Architecture 的縮寫,目前已經成為了linux的主流音頻體系結構。
在內核設備驅動層,ALSA提供了alsa-driver,同時在應用層,ALSA為我們提供了alsa-lib,應用程序只要調用alsa-lib提供的API,即可以完成對底層音頻硬件的控制。
這里寫圖片描述

實現錄音功能代碼:

/*This example reads from the default PCM device
and writes to standard output for 5 seconds of data.*/
#include <alsa/asoundlib.h>
#include <math.h>#define BUFFERSIZE 4096
#define PERIOD_SIZE 1024
#define PERIODS 2
#define SAMPLE_RATE 16000
#define CHANNELS 2
#define FSIZE 2*CHANNELS/* Use the newer ALSA API */
#define ALSA_PCM_NEW_HW_PARAMS_APIint main(int argc, char *argv[]) {long loops; //define the record time.int rc;	//return code.int size;snd_pcm_t *handle;snd_pcm_hw_params_t *params;unsigned int val;int dir;snd_pcm_uframes_t frames;char *buffer;int err;char *file;int fd;if(argc ==2){file = argv[1];}else{file = "output.raw";}fd = open(file,O_WRONLY|O_CREAT,0777);if( fd ==-1){printf("open file:%s fail.\n",file);exit(1);}/* Open PCM device for recording (capture). */err = snd_pcm_open(&handle, "default",SND_PCM_STREAM_CAPTURE, 0);if (err < 0) {fprintf(stderr,"unable to open pcm device: %s\n",snd_strerror(err));exit(1);}/* Allocate a hardware parameters object. */snd_pcm_hw_params_alloca(&params);/* Fill it in with default values. */err=snd_pcm_hw_params_any(handle, params);if (err < 0) {fprintf(stderr, "Can not configure this PCM device: %s\n",snd_strerror(err));exit(1);}/* Set the desired hardware parameters. *//* Interleaved mode */err=snd_pcm_hw_params_set_access(handle, params,SND_PCM_ACCESS_RW_INTERLEAVED);if (err < 0) {fprintf(stderr,"Failed to set PCM device to interleaved: %s\n",snd_strerror(err));exit(1);}/* Signed 16-bit little-endian format */err=snd_pcm_hw_params_set_format(handle, params,SND_PCM_FORMAT_S16_LE);if (err < 0) {fprintf(stderr,"Failed to set PCM device to 16-bit signed PCM: %s\n",snd_strerror(err));exit(1);}/* One channels (mono) */err=snd_pcm_hw_params_set_channels(handle, params, CHANNELS);if (err < 0) {fprintf(stderr, "Failed to set PCM device to mono: %s\n",snd_strerror(err));exit(1);}/* 16000 bits/second sampling rate (CD quality) */val = SAMPLE_RATE;err=snd_pcm_hw_params_set_rate_near(handle, params,&val, &dir);if (err < 0) {fprintf(stderr, "Failed to set PCM device to sample rate =%d: %s\n",val,snd_strerror(err));exit(1);}/* Set buffer time 500000. */unsigned int buffer_time,period_time;snd_pcm_hw_params_get_buffer_time_max(params, &buffer_time, 0);if ( buffer_time >500000)buffer_time = 500000;period_time = buffer_time / 4;err = snd_pcm_hw_params_set_buffer_time_near(handle, params, &buffer_time, 0);if (err < 0) {fprintf(stderr, "Failed to set PCM device to buffer time =%d: %s\n",buffer_time,snd_strerror(err));exit(1);}err = snd_pcm_hw_params_set_period_time_near(handle, params, &period_time, 0);if (err < 0) {fprintf(stderr, "Failed to set PCM device to period time =%d: %s\n",period_time,snd_strerror(err));exit(1);}/* Write the parameters to the driver */err = snd_pcm_hw_params(handle, params);if (err < 0) {fprintf(stderr,"unable to set hw parameters: %s\n",snd_strerror(err));exit(1);}/* Use a buffer large enough to hold one period */snd_pcm_hw_params_get_period_size(params,&frames, &dir);size = frames * FSIZE; /* 2 bytes/sample, 1 channels */buffer = (char *) malloc(size);printf("period size = %d frames\n", (int)frames);printf("read buffer size = %d\n",size);/* We want to loop for 5 seconds */snd_pcm_hw_params_get_period_time(params,&val, &dir);printf("period time is: %d\n",val);loops = 100;/*print alsa config parameter*/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);while (loops > 0) {loops--;rc = snd_pcm_readi(handle, buffer, frames);if (rc == -EPIPE) {// EPIPE means overrun fprintf(stderr, "overrun occurred\n");err=snd_pcm_prepare(handle);if( err <0){fprintf(stderr, "Failed to recover form overrun : %s\n",snd_strerror(err));exit(1);}}else if (rc < 0) {fprintf(stderr,"error from read: %s\n",snd_strerror(rc));exit(1);} else if (rc != (int)frames) {fprintf(stderr, "short read, read %d frames\n", rc);}rc = write(fd, buffer, size);if (rc <0){perror("fail to write to audio file\n");}}close(fd);snd_pcm_drain(handle);snd_pcm_close(handle);free(buffer);return 0;
}

實現播放聲音代碼:

#define ALSA_PCM_NEW_HW_PARAMS_API
//#include "alsahead.h"
#include <alsa/asoundlib.h>
#include <math.h>#define BUFFERSIZE 4096
#define PERIOD_SIZE 1024
#define PERIODS 2
#define SAMPLE_RATE 16000
#define CHANNELS 2
#define FSIZE 2*CHANNELS/*
*Usage: play audio.raw
*
*/int main(int argc, char *argv[]) {long loops;int rc;int size;snd_pcm_t *handle;snd_pcm_hw_params_t *params;unsigned int val;int dir;snd_pcm_uframes_t frames;char *buffer;char *inFile;int fd;int err;if(argc ==2){inFile = argv[1];}else{inFile = "output.raw";}fd = open(inFile,O_RDONLY);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(&params);/* Fill it in with default values. */err=snd_pcm_hw_params_any(handle, params);if (err < 0) {fprintf(stderr, "Can not configure this PCM device: %s\n",snd_strerror(err));exit(1);}/* Set the desired hardware parameters. *//* Interleaved mode */err=snd_pcm_hw_params_set_access(handle, params,SND_PCM_ACCESS_RW_INTERLEAVED);if (err < 0) {fprintf(stderr,"Failed to set PCM device to interleaved: %s\n",snd_strerror(err));exit(1);}/* Signed 16-bit little-endian format */err=snd_pcm_hw_params_set_format(handle, params,SND_PCM_FORMAT_S16_LE);if (err < 0) {fprintf(stderr,"Failed to set PCM device to 16-bit signed PCM: %s\n",snd_strerror(err));exit(1);}/* One channels (mono) */err=snd_pcm_hw_params_set_channels(handle, params, CHANNELS);if (err < 0) {fprintf(stderr, "Failed to set PCM device to mono: %s\n",snd_strerror(err));exit(1);}/* 16000 bits/second sampling rate (CD quality) */val = SAMPLE_RATE;err=snd_pcm_hw_params_set_rate_near(handle, params,&val, &dir);if (err < 0) {fprintf(stderr, "Failed to set PCM device to sample rate =%d: %s\n",val,snd_strerror(err));exit(1);}/*frames = PERIOD_SIZE;snd_pcm_hw_params_set_period_size_near(handle,params, &frames, &dir);*//*snd_pcm_hw_params_get_buffer_time_max(params, &buffer_time, 0);period_time = buffer_time / 4;err=snd_pcm_hw_params_set_period_time_near(handle, params,&period_time, 0);if (err < 0) {fprintf(stderr,"Failed to set PCM device to period time =%u: %s\n",period_time,snd_strerror(err));exit(1);}*/unsigned int buffer_time,period_time;snd_pcm_hw_params_get_buffer_time_max(params, &buffer_time, 0);if ( buffer_time >500000)buffer_time = 500000;period_time = buffer_time / 4;err = snd_pcm_hw_params_set_buffer_time_near(handle, params, &buffer_time, 0);if (err < 0) {fprintf(stderr, "Failed to set PCM device to buffer time =%d: %s\n",buffer_time,snd_strerror(err));exit(1);}err = snd_pcm_hw_params_set_period_time_near(handle, params, &period_time, 0);if (err < 0) {fprintf(stderr, "Failed to set PCM device to period time =%d: %s\n",period_time,snd_strerror(err));exit(1);}rc = snd_pcm_hw_params(handle, params);if (rc < 0) {fprintf(stderr,"unable to set hw parameters: %s\n",snd_strerror(rc));exit(1);}snd_pcm_hw_params_get_period_size(params, &frames,&dir);size = frames * FSIZE;buffer = (char *) malloc(size);printf("period size = %d frames\n", (int)frames);printf("read buffer size = %d\n",size);snd_pcm_hw_params_get_period_time(params,&val, &dir);printf("period time is: %d\n",val);loops = 100;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);while (loops > 0) {loops--;rc = read(fd, buffer, size);if (rc == 0) {fprintf(stderr, "end of file on input\n");break;} else if (rc != size) {fprintf(stderr,"short read: read %d bytes\n", rc);}rc = snd_pcm_writei(handle, buffer, frames);if (rc == -EPIPE) {fprintf(stderr, "underrun occurred\n");err=snd_pcm_prepare(handle);if( err <0){fprintf(stderr, "can not recover from underrun: %s\n",snd_strerror(err));}} else if (rc < 0) {fprintf(stderr,"error from writei: %s\n",snd_strerror(rc));}  else if (rc != (int)frames) {fprintf(stderr,"short write, write %d frames\n", rc);}}snd_pcm_drain(handle);snd_pcm_close(handle);free(buffer);close(fd);return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/385664.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/385664.shtml
英文地址,請注明出處:http://en.pswp.cn/news/385664.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java接口的定義與實現,學習路線+知識點梳理

Spring框架自誕生以來一直備受開發者青睞&#xff0c;有人親切的稱之為&#xff1a;Spring 全家桶。Spring更是避免了重復造輪子的工作并跟隨著互聯網行業的發展做出不斷的更新&#xff0c;很多研發人員把spring看作心目中最好的Java項目&#xff0c;沒有之一。 **可以毫不夸張…

第3章 文件IO | 001 文件描述符

概述 在Linux系統中一切皆可以看成是文件&#xff0c;文件又可分為&#xff1a;普通文件、目錄文件、鏈接文件和設備文件。文件描述符&#xff08;file descriptor&#xff09;是內核為了高效管理已被打開的文件所創建的索引&#xff0c;其是一個非負整數&#xff08;通常是小整…

java提取圖片中的文字,深入分析

第一個暴擊&#xff1a;Spring 上一份Spring的手繪思維腦圖&#xff08;就像是個知識大綱總結&#xff09;&#xff0c;預覽一下Spring的知識點&#xff0c;心里有個譜。不過這邊我是采用的截圖方式&#xff0c;為了把全部的內容都截取出來&#xff0c;所以整個就比較小&#…

Leetcode | 513. Find Bottom Left Tree Value

題目&#xff1a;翻轉二叉樹 方法①&#xff1a;深度優先遍歷(鏈接) /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ cla…

java基礎入門傳智播客答案,GitHub已標星16k

選擇 在現在這個浮躁而又拜金的社會&#xff0c;我相信很多人做技術并非出于熱愛&#xff0c;只是被互聯網的高薪吸引&#xff0c;畢竟技術崗位非常枯燥&#xff0c;不僅要面對奇奇怪怪的需求&#xff0c;還要不停的充實自己避免被淘汰。所以想要吃好技術這碗飯并不容易。 我…

563. 二叉樹的坡度

給定一個二叉樹&#xff0c;計算整個樹的坡度。 一個樹的節點的坡度定義即為&#xff0c;該節點左子樹的結點之和和右子樹結點之和的差的絕對值。空結點的的坡度是0。 整個樹的坡度就是其所有節點的坡度之和。 示例: 輸入: 1/ \2 3 輸出: 1 解釋: 結點的坡度 2 : 0 …

java基礎入門第二版二手,細節爆炸

一面&#xff1a;70分鐘 突擊電話面試 正思考著項目功能模塊&#xff0c;阿里面試官打來了電話&#xff0c;開始了阿里一面。 阿里面試官自我介紹&#xff0c;介紹了5分鐘左右&#xff0c;部門的情況&#xff0c;主要的業務 提問開始 會哪些操作系統 Linux會一點說一下操作指…

進程通訊:管道

管道&#xff0c;通常指無名管道&#xff0c;是 UNIX 系統IPC最古老的形式。 1、特點&#xff1a; 它是半雙工的&#xff08;即數據只能在一個方向上流動&#xff09;&#xff0c;具有固定的讀端和寫端。它只能用于具有親緣關系的進程之間的通信&#xff08;也是父子進程或者兄…

java基礎入門答案譚曉芳,原理+實戰講解

One&#xff1a;JVM實踐思維圖&#xff08;完整版&#xff09; Two&#xff1a; 走近Java 概述 Java技術體系Java發展史Java虛擬機家族&#xff1a;&#xff08;Sun Classic/Exact VM、HotSpot VM、Mobile/Embedded VM、BEA JRockit/IBM J9 VM、BEA Liquid VM/Azul VM、Apache…

Leetcode 102. 二叉樹的層次遍歷

給定一個二叉樹&#xff0c;返回其按層次遍歷的節點值。 &#xff08;即逐層地&#xff0c;從左到右訪問所有節點&#xff09;。 例如: 給定二叉樹: [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7 返回其層次遍歷結果&#xff1a; [ [3], [9,20], [15,7…

java基礎常問面試題,面試必問

一、首先本職工作一定要做好做精 本人之前在干兼職的時候&#xff0c;也忽視過本職工作&#xff0c;從而導致自己落后平均技術水平&#xff0c;雖然之后迎頭趕上&#xff0c;但這不能不算是個遺憾。前在接一些活的時候就感覺技術的重要性了&#xff0c;如果當年我技術再好些&a…

Leetcode | 107. Binary Tree Level Order Traversal II

題目&#xff1a;二叉樹的層次遍歷 II 1. 代碼①&#xff1a;深度優先搜索(鏈接&#xff09; /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode(int x) : val(x), left(NULL), right(NUL…

java基礎教程哪個好,吐血整理

RabbitMQ&#xff1a; 優點&#xff1a;輕量&#xff0c;迅捷&#xff0c;容易部署和使用&#xff0c;擁有靈活的路由配置 缺點&#xff1a;性能和吞吐量較差&#xff0c;不易進行二次開發 RocketMQ&#xff1a; 優點&#xff1a;性能好&#xff0c;穩定可靠&#xff0c;有活…

java基礎教程哪個好,面試必會

如何才可以進大廠&#xff1f; 答案其實也很簡單&#xff0c;能力學歷。不知道大家有沒有發現&#xff0c;大廠的一些部門對于學歷要求已經放低了&#xff0c;阿里的一些部門同樣也招大專學歷的程序員&#xff0c;當然肯定也是因為他的能力足夠出色。 對于準備秋招的你來說&a…

java基礎教程第三版耿祥義,后臺開發JAVA崗

Java虛擬機內存模型 Java虛擬機內存模型中定義的訪問操作與物理計算機處理的基本一致&#xff01; Java中通過多線程機制使得多個任務同時執行處理&#xff0c;所有的線程共享JVM內存區域main memory&#xff0c;而每個線程又單獨的有自己的工作內存&#xff0c;當線程與內存區…

501. 二叉搜索樹中的眾數

給定一個有相同值的二叉搜索樹&#xff08;BST&#xff09;&#xff0c;找出 BST 中的所有眾數&#xff08;出現頻率最高的元素&#xff09;。 假定 BST 有如下定義&#xff1a; 結點左子樹中所含結點的值小于等于當前結點的值結點右子樹中所含結點的值大于等于當前結點的值左…

java基礎案例教程黑馬程序員案例答案,真香

掌握核心知識 1、90%幾率面試被問&#xff0c;吃透原理&#xff0c;面試不慌&#xff08;Spring原理&#xff09; 2、大廠必問Redis&#xff0c;趕緊碼起來&#xff08;Redis核心原理&#xff09; 3、MySQL從入門到實戰都在這篇&#xff0c;面試笑談優化 當然核心知識不止這三…

java基礎的三個框架,進階學習資料!

阿里巴巴一面 自我介紹這個就不說了&#xff0c;開頭必問的說一下StringBuilder 和 StringBufferSpring bean加載&#xff0c;實例化的過程Spring AOP源碼看過嗎java內存模型說一下如果給你一個map&#xff0c;里面有很多很多對象&#xff0c;那么這個map存放在哪了解GC算法嗎…

實驗3 | 由遍歷序列構造二叉樹

二叉樹構造定理&#xff1a; 定理7.1&#xff1a;任何n&#xff08;n>0&#xff09;個不同結點的二又樹&#xff0c;都可由它的中序序列和先序序列唯一地確定。 定理7.2&#xff1a;任何n&#xff08;n&#xff1e;0&#xff09;個不同結點的二又樹&#xff0c;都可由它的…

萬字總結!java讓字符串反轉

Java基礎 JDK 和 JRE 有什么區別&#xff1f; 和 equals 的區別是什么&#xff1f;兩個對象的 hashCode()相同&#xff0c;則 equals()也一定為 true&#xff0c;對嗎&#xff1f;final 在 java 中有什么作用&#xff1f;java 中的 Math.round(-1.5) 等于多少&#xff1f;Stri…