<p style="margin:0;padding:0;" align="left">Hello,<br />I try to perform dynamic upsampling on a signal (SR=44,1kHz) to double the sample rate.<br />Here is the code  I wrote to test it.  It works using a raw audio file (cdparanoia -r 1) with a 1Khz sin signal.<br />When I look to my output signal with an oscilloscope it looks quite good but I get some noise (glitches?) that makes it really sound bad.<br />Is there something I do wrong ? Is it a libsamplerate problem ?<br /><br />**************************<br />******My code*************<br />**************************<br /><br /><br /><br />#include <stdio.h><br />#ifdef HAVE_STDLIB_H<br />#include <stdlib.h><br />#endif<br /><br />#include <math.h><br />#include <unistd.h><br />#include <fcntl.h><br />#include <sys/types.h><br />#include <sys/time.h><br />#include <samplerate.h><br /><br />int<br />main(int argc, const char *argv[])<br />{<br />  int TAILLEBUF = TAILLEBUF;<br />  int TAILLEBUF_OUT = TAILLEBUF;<br /><br />  int16_t * p_readbuf= (int16_t *) malloc(sizeof(int16_t)*TAILLEBUF);<br />  float * pf_readbuf= ( float *) malloc(sizeof(float)*TAILLEBUF);<br />  float * pf_writebuf= ( float *) malloc(sizeof(float)*TAILLEBUF_OUT);<br /><br />  int fini=0;<br />  int finiRead=0;<br /><br />  int fd,fdread;    /* sound device file descriptor */<br /> <br />  struct timeval tv;<br />  tv.tv_sec = 0;<br />  tv.tv_usec = 120000;<br />  int error;<br /><br />  SRC_STATE * src_state;<br />  SRC_DATA src_data;<br />  src_data.src_ratio = atoi(argv[3]);<br />  src_data.input_frames=0;<br />  src_data.end_of_input = 0;<br />  src_data.data_out = pf_writebuf;<br />  src_data.output_frames=TAILLEBUF_OUT/2;<br /><br />  src_state = src_new(2,2,&error);<br /><br />  /* open sound device I'm working on my own sound card */<br />  fd = open("/dev/AudioDriver/data", O_WRONLY); <br />  if (fd < 0) {<br />    perror("open of /dev/AudioDriver/data failed");<br />    exit(1);<br />  }<br /><br />/*My raw sound file*/<br />  fdread = open("./cdda.raw", O_RDONLY);<br />  if (fd < 0) {<br />    perror("open of cdda.raw failed");<br />    exit(1);<br />  }<br /><br /><br />  fd_set writefds[1];<br />  FD_ZERO(writefds);<br />  FD_SET(fd, writefds);<br />  int k=0;<br />       while (!finiRead) {<br /><br />    /* read TAILLEBUF/2 Frames */<br /><br />    int j;<br />    if(read(fdread,p_readbuf,TAILLEBUF*sizeof(int16_t))!=TAILLEBUF*sizeof(int16_t))<br />            finiRead=1;<br />    <br />    int i=0;<br />    /*Convert from 16bit integer to Float*/ <br />           for(i=0;i<TAILLEBUF;i++)<br />      {<br />        pf_readbuf[i]=((p_readbuf[i])<<16) ;<br />        }<br />        <br />    if(src_data.input_frames==0)<br />      {<br />        src_data.data_in = pf_readbuf;<br />        src_data.input_frames=TAILLEBUF/2;<br />      }<br /><br />    tv.tv_sec = 0;<br />    tv.tv_usec = 120000;<br />    fd_set writefds[1];<br />    FD_ZERO(writefds);<br />    FD_SET(fd, writefds);<br />    while(select(fd+1, NULL, writefds, NULL, &tv)!=1){    <br />      tv.tv_sec = 0;<br />      tv.tv_usec = 120000;<br />      fd_set writefds[1];<br />      FD_ZERO(writefds);<br />      FD_SET(fd, writefds);<br />    }<br /><br />    int sent = 0;<br />      <br />      if((error = src_process(src_state,&src_data))!=0)printf("error\n");<br />    <br />      while(sent < src_data.output_frames_gen)<br />        {<br />            /*Convert my 2-floats frame to an unsigned long frame containing my to channels*/<br />          unsigned long frame;<br />          frame = (unsigned long) ((src_data.data_out[sent]))>>16;<br />          frame |= (((unsigned long) (src_data.data_out[sent+1])) & 0xFFFF0000);<br />          if(write(fd, &frame, sizeof(unsigned long))!=sizeof(unsigned long))<br />        {fini = 1;<br />        }<br />          sent += 2;<br />       }<br />  exit(0);<br />}<br /><br />****************************<br />****************************<br />****************************<br /><br /><br />I hope that you can understand my english and that my code is clear enough for you to help me.<br />Thanks in advance.<br /><br />Mathieu<br /></p>