资源简介

基于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);  
       

评论

共有 条评论