资源简介
基于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);
相关资源
- uboot到linux logo显示不间断 补丁
- UNIX/LINUX编程实践教程的源码
- Linux任务管理器
- linux应用层的华容道游戏源代码
- ubuntu9.10 可加载内核模块和字符设备驱
- MP3文件ID3v2ID3v2APEv2标签读取
- 操作系统实验——虚存管理实验
- linux下的发包工具sendip
- 尚观培训linux许巍关于c 的笔记和讲义
- 尚观培训linux董亮老师关于数据结构的
- linux 线程池源码 c 版
- linux C 电梯程序练习
- linux下用多进程同步方法解决生产者
- Linux 操作系统实验(全)
- Linux From Scratch 中文手册
- linux 网络实验 ftp程序
- Linux命令大全离线版&在线版
- 操作系统共享内存实验
- dos 下运行Linux 命令--gnu_utils
- linux 0.12内核源代码
- linux简易shell C实现
- linux实验报告及心得体会
- 基于GTK的Linux环境下的简易任务管理器
- linux扫雷游戏代码
- CAN Linux驱动代码
- Linux系统教材
- intel 82579LM 网卡驱动Linux系统版 v1.9.
- SA1110处理器掌上电脑液晶显示器设计
- 基于Linux的串口服务器设计
- Windows下访问LINUX的利器-SSH
评论
共有 条评论