资源简介
基于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);
相关资源
- chkconfig.deb
- 老王2018Linux运维.zip
- Quectel_LTE&5G_Linux_USB_Driver_User_Guide_V2.
- kali-linux-2017.3-vm-i386 32位
- linux-KVM虚拟机GPU透传操作步骤.docx
- mcp23017 linux 驱动 支持扩展io中断
-
Dalsa Camerali
nk相机采集代码 - Linux下sar工具使用
- linux高性能服务器编程源码66818
- windows-linux基线离线扫描脚本.zip
- SLE-15-SP2-Full-x86_64-GM-Media2.iso
- iMX6从uboot到linux启动完成一直保持LO
- 基于Linux的模拟文件系统管理的设计与
- 嵌入式系统linux学习心得
- centos-6.4-x86_64位百度云链接
- unix linux 等的xerces安装及配置
- Linux试题
- linux下telnet源代码
- Linux 0.11下信号量的简单实现——用生
- linux ubuntu
- linux下多线程socket通信完整源码文件
- 深入理解Linux内核第三版中文版+英文
- 最全Linux C 库函数官方中文API手册
- UbuntuLinux下通过ndiswrapper安装无线网卡
- deepin-scrot
- linux下Questasim10/Modelsim安装以及破解方
- how linux works 精通linux 中文版 第二版
- 在Linux环境下模拟实现简单命令解释器
- IT机房搬迁实施方案
- 马哥Linux2016全套视频教程及随堂笔记
评论
共有 条评论