Update of /cvsroot/pure-data/pd/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv3778
Modified Files: Tag: desiredata d_soundfile.c Log Message: using more t_param (again)
Index: d_soundfile.c =================================================================== RCS file: /cvsroot/pure-data/pd/src/d_soundfile.c,v retrieving revision 1.4.4.11.2.10.2.25 retrieving revision 1.4.4.11.2.10.2.26 diff -C2 -d -r1.4.4.11.2.10.2.25 -r1.4.4.11.2.10.2.26 *** d_soundfile.c 20 Jul 2007 04:39:56 -0000 1.4.4.11.2.10.2.25 --- d_soundfile.c 20 Jul 2007 05:08:16 -0000 1.4.4.11.2.10.2.26 *************** *** 197,208 ****
int open_soundfile_via_fd(int fd, int headersize, t_param *p, long skipframes) { ! int nchannels, bigendian, bytespersample, swap, sysrtn; ! long bytelimit = 0x7fffffff; errno = 0; if (headersize >= 0) { /* header detection overridden */ ! bigendian = p->bigendian; ! nchannels = p->nchannels; ! bytespersample = p->bytespersample; ! bytelimit = p->bytelimit; } else { char buf[MAXPDSTRING]; --- 197,209 ----
int open_soundfile_via_fd(int fd, int headersize, t_param *p, long skipframes) { ! int swap, sysrtn; errno = 0; + t_param q; + q.bytelimit = 0x7fffffff; if (headersize >= 0) { /* header detection overridden */ ! q.bigendian = p->bigendian; ! q.nchannels = p->nchannels; ! q.bytespersample = p->bytespersample; ! q.bytelimit = p->bytelimit; } else { char buf[MAXPDSTRING]; *************** *** 211,235 **** if (bytesread < 4) goto badheader; ! if (!strncmp(buf, ".snd", 4)) format = FORMAT_NEXT, bigendian = 1; ! else if (!strncmp(buf, "dns.", 4)) format = FORMAT_NEXT, bigendian = 0; else if (!strncmp(buf, "RIFF", 4)) { if (bytesread < 12 || strncmp(buf + 8, "WAVE", 4)) goto badheader; ! format = FORMAT_WAVE, bigendian = 0; } else if (!strncmp(buf, "FORM", 4)) { if (bytesread < 12 || strncmp(buf + 8, "AIFF", 4)) goto badheader; ! format = FORMAT_AIFF, bigendian = 1; } else goto badheader; ! swap = (bigendian != garray_ambigendian()); if (format == FORMAT_NEXT) { /* nextstep header */ if (bytesread < (int)sizeof(t_nextstep)) goto badheader; ! nchannels = swap4(((t_nextstep *)buf)->nchans, swap); format = swap4(((t_nextstep *)buf)->format, swap); headersize = swap4(((t_nextstep *)buf)->onset, swap); ! if (format == NS_FORMAT_LINEAR_16) bytespersample = 2; ! else if (format == NS_FORMAT_LINEAR_24) bytespersample = 3; ! else if (format == NS_FORMAT_FLOAT) bytespersample = 4; else goto badheader; ! bytelimit = 0x7fffffff; } else if (format == FORMAT_WAVE) { /* wave header */ /* This is awful. You have to skip over chunks, --- 212,236 ---- if (bytesread < 4) goto badheader; ! if (!strncmp(buf, ".snd", 4)) {format = FORMAT_NEXT; q.bigendian = 1;} ! else if (!strncmp(buf, "dns.", 4)) {format = FORMAT_NEXT; q.bigendian = 0;} else if (!strncmp(buf, "RIFF", 4)) { if (bytesread < 12 || strncmp(buf + 8, "WAVE", 4)) goto badheader; ! format = FORMAT_WAVE; q.bigendian = 0; } else if (!strncmp(buf, "FORM", 4)) { if (bytesread < 12 || strncmp(buf + 8, "AIFF", 4)) goto badheader; ! format = FORMAT_AIFF; q.bigendian = 1; } else goto badheader; ! swap = (q.bigendian != garray_ambigendian()); if (format == FORMAT_NEXT) { /* nextstep header */ if (bytesread < (int)sizeof(t_nextstep)) goto badheader; ! q.nchannels = swap4(((t_nextstep *)buf)->nchans, swap); format = swap4(((t_nextstep *)buf)->format, swap); headersize = swap4(((t_nextstep *)buf)->onset, swap); ! if (format == NS_FORMAT_LINEAR_16) q.bytespersample = 2; ! else if (format == NS_FORMAT_LINEAR_24) q.bytespersample = 3; ! else if (format == NS_FORMAT_FLOAT) q.bytespersample = 4; else goto badheader; ! q.bytelimit = 0x7fffffff; } else if (format == FORMAT_WAVE) { /* wave header */ /* This is awful. You have to skip over chunks, *************** *** 241,246 **** /* First we guess a number of channels, etc., in case there's no "fmt" chunk to follow. */ ! nchannels = 1; ! bytespersample = 2; /* copy the first chunk header to beginnning of buffer. */ memcpy(buf, buf + headersize, sizeof(t_wavechunk)); --- 242,247 ---- /* First we guess a number of channels, etc., in case there's no "fmt" chunk to follow. */ ! q.nchannels = 1; ! q.bytespersample = 2; /* copy the first chunk header to beginnning of buffer. */ memcpy(buf, buf + headersize, sizeof(t_wavechunk)); *************** *** 253,261 **** if (seekout != commblockonset) goto badheader; if (read(fd, buf, sizeof(t_fmt)) < (int) sizeof(t_fmt)) goto badheader; ! nchannels = swap2(((t_fmt *)buf)->nchannels, swap); format = swap2(((t_fmt *)buf)->nbitspersample, swap); ! if (format == 16) bytespersample = 2; ! else if (format == 24) bytespersample = 3; ! else if (format == 32) bytespersample = 4; else goto badheader; } --- 254,262 ---- if (seekout != commblockonset) goto badheader; if (read(fd, buf, sizeof(t_fmt)) < (int) sizeof(t_fmt)) goto badheader; ! q.nchannels = swap2(((t_fmt *)buf)->nchannels, swap); format = swap2(((t_fmt *)buf)->nbitspersample, swap); ! if (format == 16) q.bytespersample = 2; ! else if (format == 24) q.bytespersample = 3; ! else if (format == 32) q.bytespersample = 4; else goto badheader; } *************** *** 265,269 **** headersize = seekto; } ! bytelimit = swap4(((t_wavechunk *)buf)->size, swap); headersize += 8; } else { --- 266,270 ---- headersize = seekto; } ! q.bytelimit = swap4(((t_wavechunk *)buf)->size, swap); headersize += 8; } else { *************** *** 272,277 **** if (bytesread < 20) goto badheader; /* First we guess a number of channels, etc., in case there's no COMM block to follow. */ ! nchannels = 1; ! bytespersample = 2; /* copy the first chunk header to beginnning of buffer. */ memcpy(buf, buf + headersize, sizeof(t_datachunk)); --- 273,278 ---- if (bytesread < 20) goto badheader; /* First we guess a number of channels, etc., in case there's no COMM block to follow. */ ! q.nchannels = 1; ! q.bytespersample = 2; /* copy the first chunk header to beginnning of buffer. */ memcpy(buf, buf + headersize, sizeof(t_datachunk)); *************** *** 284,291 **** if (seekout != commblockonset) goto badheader; if (read(fd, buf, sizeof(t_comm)) < (int) sizeof(t_comm)) goto badheader; ! nchannels = swap2(((t_comm *)buf)->nchannels, swap); format = swap2(((t_comm *)buf)->bitspersamp, swap); ! if (format == 16) bytespersample = 2; ! else if (format == 24) bytespersample = 3; else goto badheader; } --- 285,292 ---- if (seekout != commblockonset) goto badheader; if (read(fd, buf, sizeof(t_comm)) < (int) sizeof(t_comm)) goto badheader; ! q.nchannels = swap2(((t_comm *)buf)->nchannels, swap); format = swap2(((t_comm *)buf)->bitspersamp, swap); ! if (format == 16) q.bytespersample = 2; ! else if (format == 24) q.bytespersample = 3; else goto badheader; } *************** *** 295,312 **** headersize = seekto; } ! bytelimit = swap4(((t_datachunk *)buf)->size, swap); headersize += 8; } } /* seek past header and any sample frames to skip */ ! sysrtn = lseek(fd, nchannels * bytespersample * skipframes + headersize, 0); ! if (sysrtn != nchannels * bytespersample * skipframes + headersize) return -1; ! bytelimit -= nchannels * bytespersample * skipframes; ! if (bytelimit < 0) bytelimit = 0; /* copy sample format back to caller */ ! p->bigendian = bigendian; ! p->nchannels = nchannels; ! p->bytespersample = bytespersample; ! p->bytelimit = bytelimit; return fd; badheader: --- 296,313 ---- headersize = seekto; } ! q.bytelimit = swap4(((t_datachunk *)buf)->size, swap); headersize += 8; } } /* seek past header and any sample frames to skip */ ! sysrtn = lseek(fd, q.bytesperchannel() * skipframes + headersize, 0); ! if (sysrtn != q.bytesperchannel() * skipframes + headersize) return -1; ! q.bytelimit -= q.bytesperchannel() * skipframes; ! if (q.bytelimit < 0) q.bytelimit = 0; /* copy sample format back to caller */ ! p->bigendian = q.bigendian; ! p->nchannels = q.nchannels; ! p->bytespersample = q.bytespersample; ! p->bytelimit = q.bytelimit; return fd; badheader: *************** *** 2000,2006 **** x->fileerror = 0; x->state = STATE_STARTUP; ! if (samplerate > 0) x->samplerate = samplerate; ! else if (x->insamplerate > 0) x->samplerate = x->insamplerate; ! else x->samplerate = sys_getsr(); /* set fifosize from bufsize. fifosize must be a multiple of the number of bytes eaten for each DSP tick. */ x->fifosize = x->bufsize - x->bufsize % (x->p.bytesperchannel() * MAXVECSIZE); --- 2001,2005 ---- x->fileerror = 0; x->state = STATE_STARTUP; ! x->samplerate = samplerate>0 ? samplerate : x->insamplerate>0 ? x->insamplerate : sys_getsr(); /* set fifosize from bufsize. fifosize must be a multiple of the number of bytes eaten for each DSP tick. */ x->fifosize = x->bufsize - x->bufsize % (x->p.bytesperchannel() * MAXVECSIZE);