• 大小: 7KB
    文件类型: .gz
    金币: 2
    下载: 1 次
    发布日期: 2021-06-23
  • 语言: C/C++
  • 标签: Linux  ALSA  UDP  语音  

资源简介

Linux下局域网内IP对讲程序, 执行gcc -o sound_send sound.c -lasound gcc -o sound_recv sound.recv.c -lasound编译程序。 ./sound_recv 4600(端口号)运行接收程序 ./sound_send 192.168.1.1(IP地址) 4600(端口号)运行发送程序。 使用ALSA驱动 C语言编写 参数可自己设置重新编译。

资源截图

代码片段和文件信息

#include   
#include   
#include   
#include   
#include   
#include   
#include   
#include 

int main(int argc char* argv[]) {  
   
int sin_len;   
int socket_descriptor;  
int port; 
struct sockaddr_in sin; 
      
  if (argc != 2){
printf(“Usage: sound_recv  PORT \n“);
exit(1);
}
port = atoi(argv[1]);
int rc;
int dir;
int size;
snd_pcm_t *handle;
snd_pcm_hw_params_t *params;
snd_pcm_uframes_t frames;
unsigned int val;
char *buffer;
  printf(“Waiting for data form sender \n“);  
  
bzero(&sinsizeof(sin));  
sin.sin_family=AF_INET;  
sin.sin_addr.s_addr=htonl(INADDR_ANY);  
sin.sin_port=htons(port);  
sin_len=sizeof(sin);  
socket_descriptor=socket(AF_INETSOCK_DGRAM0);  
bind(socket_descriptor(struct sockaddr *)&sinsizeof(sin));  



/* Open PCM device for playback. */
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(¶ms);

/* Fill it in with default values. */
snd_pcm_hw_params_any(handle params);

/* Set the desired hardware parameters. */

/* Interleaved mode */
snd_pcm_hw_params_set_access(handle params
                       SND_PCM_ACCESS_RW_INTERLEAVED);

/* Signed 16-bit little-endian format */
snd_pcm_hw_params_set_format(handle params
                               SND_PCM_FORMAT_S16_LE);

/* Two channels (stereo) */
snd_pcm_hw_params_set_channels(handle params 1);

/* 44100 bits/second sampling rate (CD quality) */
val = 44100;
snd_pcm_hw_params_set_rate_near(handle params
                                   &val &dir);

/* Set period size to 16 frames. */
frames = 32;
snd_pcm_hw_params_set_period_size_near(handle
                               params &frames &dir);

/* Write the parameters to the driver */
rc = snd_pcm_hw_params(handle params);
if (rc < 0) {
fprintf(stderr
“unable to set hw parameters: %s/n“
snd_strerror(rc));
exit(1);
}

/* Use a buffer large enough to hold one period */
snd_pcm_hw_params_get_period_size(params &frames
                                     &dir);
size = frames * 2; /* 2 bytes/sample 1 channels */
buffer = (char *) malloc(size);

/* We want to loop for 5 seconds */
snd_pcm_hw_params_get_period_time(params
                                     &val &dir);
 
while(1)  
{       
rc = recvfrom(socket_descriptorbuffersize0(struct sockaddr *)&sin&sin_len); 
fprintf(stderr
“ %s/n“
snd_strerror(rc));  
rc = snd_pcm_writei(handle buffer sizeof(buffer));          
        }  

  
    
   
  
  
close(socket_descriptor);  
snd_pcm_drain(handle);
snd_pcm_close(handle);
free(buffer);
return 0;
}

评论

共有 条评论