this is the program which is a improved version of program written by whicxh was posred in this mail.So , this program transfers Voice over IP. but There is no synchronisation. Can any body tell solutio for these issues:
1. How to make server which is actiong as a playback program waits and plays in order the packets received from the client.
2. sychonisation issue.
3. How to over come the buffer xrun in case of playback?
i really thank Mr. for writing this fine program so that i could extend it.
thank u ,
and waiting for ur assisatnce,
************************************************************* Client.c captures and sends tyhe packets to the server ********************************************************** #include <stdio.h> #include <string.h> #include <sys/socket.h> #include <resolv.h> #include <netinet/in.h> #include <unistd.h> #include <arpa/inet.h> #include <netdb.h>
#define ALSA_PCM_NEW_HW_PARAMS_API #define ALSA_PCM_NEW_SW_PARAMS_API #include "../include/asoundlib.h"
#define DEST_PORT 9999 #define PERIODSIZE 512 #define BUFSIZE (PERIODSIZE *4)
int sock_cli; char SERV_IP[15] = "10.115.3.131"; struct sockaddr_in cli_addr;
int samplerate = 22050; int channels = 2; int accessmode = SND_PCM_ACCESS_RW_INTERLEAVED; int format = SND_PCM_FORMAT_S16_LE; int periods = 4; snd_pcm_uframes_t buffer_size = PERIODSIZE * 4; snd_pcm_uframes_t period_size = PERIODSIZE; snd_output_t *output = NULL;
#define checkr(r) if (r <0) { \ fprintf(stderr,"%s\n",snd_strerror(r));\ exit(-1);\ }
int tcpip_init(void) {
if((sock_cli = socket( AF_INET,SOCK_STREAM,0)) < 0) { perror("can not create socket\n"); exit(1); }
bzero(&cli_addr,sizeof(cli_addr)); cli_addr.sin_family = AF_INET; cli_addr.sin_port = htons(DEST_PORT);
if(inet_pton(AF_INET,SERV_IP,&cli_addr.sin_addr) == 0) { perror("can not be converted\n"); exit(1); }
if(connect(sock_cli,(struct sockaddr*)&cli_addr,sizeof(cli_addr)) < 0)
{
perror("error in connecting\n");
exit(1);
} else printf("connection successful, connected to server\n");
return 0; }
int set_hw_params(snd_pcm_t *handle) { int r; snd_pcm_hw_params_t *hwparams; snd_pcm_sw_params_t *swparams;
r = snd_pcm_hw_params_malloc(&hwparams);checkr(r);
r = snd_pcm_hw_params_any(handle,hwparams);checkr(r);
r = snd_pcm_hw_params_set_access(handle,hwparams,accessmode);checkr(r);
r = snd_pcm_hw_params_set_format(handle,hwparams,format);checkr(r);
r = snd_pcm_hw_params_set_channels(handle,hwparams,channels);checkr(r);
r = snd_pcm_hw_params_set_rate_near(handle,hwparams,&samplerate,0);checkr(r);
r = snd_pcm_hw_params_set_periods(handle,hwparams,periods,0);checkr(r);
r = snd_pcm_hw_params_set_buffer_size_near(handle,hwparams,&buffer_size);checkr(r);
r = snd_pcm_hw_params_set_period_size_near(handle,hwparams,&period_size,0);checkr(r);
r = snd_pcm_hw_params(handle,hwparams);checkr(r);
r = snd_pcm_sw_params_malloc(&swparams);checkr(r);
r = snd_pcm_sw_params_current(handle,swparams);checkr(r);
r = snd_pcm_sw_params_set_avail_min(handle,swparams,period_size);checkr(r);
r = snd_pcm_sw_params(handle,swparams);checkr(r);
snd_pcm_prepare(handle);
return 0;
}
int main() {
short buf[BUFSIZE * 10];
int r,i;
snd_pcm_t *pcmc;
r = snd_pcm_open(&pcmc,"plughw:0,0",SND_PCM_STREAM_CAPTURE,0);checkr(r);
set_hw_params(pcmc);
tcpip_init();
while(1) {
r = snd_pcm_readi(pcmc,buf,BUFSIZE);
if(r == BUFSIZE)printf("record r = %d\n",r);
else { printf("record r = %d\n",r); checkr(r); }
r = send(sock_cli,buf,BUFSIZE,0); if(r < 0) { printf("socket send error\n"); close(sock_cli); exit(-1); } else printf("sent bytes %d\n",r); for(i = 0;i<100;i++);
}
//else printf("no of bytes sent %d",result);
close(sock_cli); snd_pcm_close(pcmc);
return 0; } ****************************************************** server.c waits for packets and plays them *****************************************************
#include<stdio.h> #include<string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <resolv.h> #include <errno.h> #define ALSA_PCM_NEW_HW_PARAMS_API #define ALSA_PCM_NEW_SW_PARAMS_API #include "../include/asoundlib.h" #define BIND_PORT 9999 #define BACK_LOG 5 #define PERIODSIZE 512 #define BUFSIZE (PERIODSIZE * 4)
#define checkr(r) if(r<0) { \ fprintf(stderr,"%s \n",snd_strerror(r));\ exit(-1);\ } int serv_sock, new_sock; struct sockaddr_in server_addr,local_addr;
/* new */ int samplerate = 22050; int channels = 2; int accessmode = SND_PCM_ACCESS_RW_INTERLEAVED; int format = SND_PCM_FORMAT_S16_LE; int periods = 4;
snd_pcm_t *pcmp; snd_pcm_uframes_t buffer_size = PERIODSIZE * 4; snd_pcm_uframes_t period_size = PERIODSIZE; snd_output_t *output = NULL;
int tcpip_init() {
int len;
if (( serv_sock = socket( AF_INET,SOCK_STREAM,0 )) < 0) { perror("can not open server socket\n"); abort(); }
bzero(&server_addr,sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_port = htons( BIND_PORT); server_addr.sin_addr.s_addr = INADDR_ANY;
if(bind(serv_sock,(struct sockaddr*)&server_addr,sizeof(server_addr)) < 0)
{
perror(" error in binding\n");
abort();
}
if(listen(serv_sock,BACK_LOG) < 0) { perror(" error in listen\n"); abort(); } else printf("listening\n");
len = sizeof(local_addr);
new_sock = (accept(serv_sock,(struct sockaddr *)&local_addr,&len));
if (new_sock == ( EBADF|| ENOTSOCK ||EOPNOTSUPP))
printf("not a valid one\n");
else
printf("accepted client:%s\n",inet_ntoa(local_addr.sin_addr));
return 0; }
int set_hw_params(snd_pcm_t *handle) { int r; snd_pcm_hw_params_t *hwparams; snd_pcm_sw_params_t *swparams;
r = snd_pcm_hw_params_malloc(&hwparams);checkr(r);
r = snd_pcm_hw_params_any(handle,hwparams);checkr(r);
r = snd_pcm_hw_params_set_access(handle,hwparams,accessmode);checkr(r);
r = snd_pcm_hw_params_set_format(handle,hwparams,format); checkr(r);
r = snd_pcm_hw_params_set_channels(handle,hwparams,channels);checkr(r);
r = snd_pcm_hw_params_set_rate_near(handle,hwparams,&samplerate,0);checkr(r);
r = snd_pcm_hw_params_set_periods(handle,hwparams,periods,0); checkr(r);
r = snd_pcm_hw_params_set_buffer_size_near(handle,hwparams,&buffer_size);checkr(r);
r = snd_pcm_hw_params_set_period_size_near(handle,hwparams,&period_size,0);checkr(r);
r = snd_pcm_hw_params(handle,hwparams);checkr(r);
r = snd_pcm_sw_params_malloc(&swparams);checkr(r);
r = snd_pcm_sw_params_current(handle,swparams);checkr(r);
r = snd_pcm_sw_params_set_avail_min(handle,swparams,period_size);checkr(r);
r = snd_pcm_sw_params(handle,swparams);checkr(r);
snd_pcm_prepare(handle);
return 0; }
int main (void) {
short buf[BUFSIZE*10]; int r ,i; snd_pcm_t *pcmp;
r = snd_pcm_open(&pcmp,"plughw:0,0",SND_PCM_STREAM_PLAYBACK,0);checkr(r);
set_hw_params(pcmp);
tcpip_init();
while(1) { for(i = 0;i<100;i++); r = recv(new_sock,buf,BUFSIZE,0); if(r <0){ perror("socket recv error\n"); printf("%d\n",r);}
else { printf("bytes received %d\n",r); r = snd_pcm_writei(pcmp,buf,BUFSIZE); if( (r == -EPIPE) || (r<0)) snd_pcm_prepare(pcmp); if((r != BUFSIZE) || (r== BUFSIZE)) printf("playback r = %d\n",r); //else checkr(r);
}
}
// snd_pcm_drain(write_handle); // snd_pcm_close(write_handle);
snd_pcm_close(pcmp); close(new_sock); close(serv_sock);
return 0; }
___________________________________________________ Get www. mycompany .com and 5 matching email ids. Just Rs. 1499/ year. Click here http://www.rediffmailpro.com
------------------------------------------------------- This SF.Net email is sponsored by: INetU Attention Web Developers & Consultants: Become An INetU Hosting Partner. Refer Dedicated Servers. We Manage Them. You Get 10% Monthly Commission! INetU Dedicated Managed Hosting http://www.inetu.net/partner/index.php _______________________________________________ Alsa-devel mailing list [EMAIL PROTECTED] https://lists.sourceforge.net/lists/listinfo/alsa-devel