資源簡介
基于linux alsa 聲卡編程,用c寫的代碼,能夠語音聊天
代碼片段和文件信息
/*??
本程序維護一個?256bytes*4?緩沖區,兩個信號量保護(讀和寫)。創建兩
個線程,一個用于采集聲卡數據并寫到緩沖區,數據采集線程使用ALSA接口
編程,設置采樣率?22333,周期幀數?128,幀格式?U8聲道數?2,每個周期
大約?5.73ms,每個周期?256bytes。另外一個將緩沖區數據廣播到網絡,每
次發送?256bytes。
*/??
??
#define?ALSA_PCM_NEW_HW_PARAMS_API???
??
#include???
#include???
#include???
#include???
#include???
#include?????/*?basic?system?data?types?*/??
#include????/*?basic?socket?definitions?*/??
#include????/*?sockaddr_in{}?and?other?Internet?defns?*/??
#include?????/*?inet(3)?functions?*/??
??
#define?RATE?22333??
#define?CHANNEL?2??
#define?FORMAT??SND_PCM_FORMAT_U8??
#define?frameS??128??
??
#define?SIZE?CHANNEL*frameS*1??
??
#define?NBUFF????4???
??
//?套接字端口??
#define?PORT?10000???
#define?SA??struct?sockaddr??
??
//?數據緩沖區及信號量??
struct?{??????
????char???buffer[1024];???
????sem_t?mutex?nempty?nstored;???
}?shared;??
??
char*?pRead?=?shared.buffer;?//讀指針??
char*?pWrite?=?shared.buffer;?//寫指針??
void*?sendData(void?*arg);?//線程函數,廣播數據??
void*?generateData(void?*arg);?//線程函數,讀聲卡??
??
//?計數變量??
long?produce=0;??
long?consume=0;??
long?totalTime?=?0;??
??
int?main()???
{?????
????pthread_t???tid_generateData?tid_sendData;??
??
????//?初始化信號量??
????sem_init(&shared.mutex?0?1);??//未用到??
????sem_init(&shared.nempty?0?NBUFF);???
????sem_init(&shared.nstored?0?0);???
?????
????//?創建讀聲卡線程,將數據保存到緩沖區??
????pthread_create(&tid_generateData?NULL?generateData?NULL);??
????//?創建廣播線程,將緩沖區數據發送到網絡??
????pthread_create(&tid_sendData?NULL?sendData?NULL);???
???
????pthread_join(tid_sendData?NULL);???
????pthread_join(tid_generateData?NULL);???
???
????sem_destroy(&shared.mutex);???
????sem_destroy(&shared.nempty);???
????sem_destroy(&shared.nstored);???
????exit(0);???
}???
??
void*?sendData(void?*arg)??
{??
????int?????????sockfd;??
????struct??????sockaddr_in?????servaddr;??
??????
????/*?socket?初始化?*/??
????const?int?on?=?1;??
????int?n;
????bzero(&servaddr?sizeof(servaddr));??
????servaddr.sin_family?=?AF_INET;??
????servaddr.sin_port?=?htons(PORT);??
????inet_pton(AF_INET?“172.19.73.113“?&servaddr.sin_addr);??
????sockfd?=?socket(AF_INET?SOCK_DGRAM?0);??
????setsockopt(sockfd?SOL_SOCKET?SO_BROADCAST?&on?sizeof(on));??
??????
????printf(“\n\n\n\n\nData?generating?starts?Broadcasting?...\n\n\n\n\n\n\n\n\n\n“);??
????printf(“|------------------------------------------------------------|\t0\tmin?|\n\033[1A|“);??
????while(1)??
????{??
????????//?獲取nstored信號量??
????????sem_wait(&shared.nstored);??
?????????
????????//?發送數據??
????????n?=?sendto(sockfd?pRead?256?0?pservaddr?servlen);??
????????if(n!=256)?//printf(“send?short:?send?%d\n“n)??
????????{??
????????????sem_post(&shared.nstored);??
????????????continue;??
????????}??
?????????
????????//?更新緩沖區讀指針??
????????pRead?+=?256;??
????????if(pRead-1024?==?shared.buffer)??
????????????pRead?=?shared.buffer;??
??????????????
????????//?釋放nempty信號量??
????????sem_post(&shared.nempty);??
???????
評論
共有 條評論