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
