Section rewrite to fix an assumption that long int is always 32 bits.
From upstream CVS; bug reported by Don Jackson.
This commit is contained in:
parent
deb54169e0
commit
cd5be11251
@ -1,8 +1,9 @@
|
||||
# $OpenBSD: Makefile,v 1.36 2007/09/15 21:26:03 simon Exp $
|
||||
# $OpenBSD: Makefile,v 1.37 2008/07/08 15:03:37 naddy Exp $
|
||||
|
||||
COMMENT= SOund eXchange - universal sound sample translator
|
||||
|
||||
DISTNAME= sox-12.18.2
|
||||
PKGNAME= ${DISTNAME} # also see below
|
||||
CATEGORIES= audio
|
||||
HOMEPAGE= http://sox.sourceforge.net/
|
||||
|
||||
@ -34,6 +35,7 @@ CONFIGURE_ARGS+= --disable-ogg-vorbis
|
||||
.endif
|
||||
|
||||
.if ${FLAVOR:L:Mmp3}
|
||||
PKGNAME= ${DISTNAME}p0
|
||||
LIB_DEPENDS+= mad.>=2::audio/libmad mp3lame::audio/lame
|
||||
.else
|
||||
CONFIGURE_ARGS+= --disable-mad --disable-lame
|
||||
|
97
audio/sox/patches/patch-src_mp3_c
Normal file
97
audio/sox/patches/patch-src_mp3_c
Normal file
@ -0,0 +1,97 @@
|
||||
$OpenBSD: patch-src_mp3_c,v 1.1 2008/07/08 15:03:37 naddy Exp $
|
||||
--- src/mp3.c.orig Sun Jun 29 18:37:31 2008
|
||||
+++ src/mp3.c Sun Jun 29 18:51:20 2008
|
||||
@@ -423,31 +423,56 @@ st_ssize_t st_mp3write(ft_t ft, st_sample_t *buf, st_s
|
||||
struct mp3priv *p = (struct mp3priv *) ft->priv;
|
||||
char *mp3buffer;
|
||||
int mp3buffer_size;
|
||||
- long *buffer_l, *buffer_r;
|
||||
+ short signed int *buffer_l, *buffer_r = NULL;
|
||||
int nsamples = samp/ft->info.channels;
|
||||
int i,j;
|
||||
st_ssize_t done = 0;
|
||||
int written;
|
||||
|
||||
- if ( (buffer_r=(long*)malloc(nsamples*sizeof(long))) == NULL){
|
||||
+ /* NOTE: This logic assumes that "short int" is 16-bits
|
||||
+ * on all platforms. It happens to be for all that I know
|
||||
+ * about.
|
||||
+ *
|
||||
+ * Lame ultimately wants data scaled to 16-bit samples
|
||||
+ * and assumes for the majority of cases that your passing
|
||||
+ * in something scaled based on passed in datatype
|
||||
+ * (16, 32, 64, and float).
|
||||
+ *
|
||||
+ * If we used long buffers then this means it expects
|
||||
+ * different scalling between 32-bit and 64-bit CPU's.
|
||||
+ *
|
||||
+ * We might as well scale it ourselfs to 16-bit to allow
|
||||
+ * malloc()'ing a smaller buffer and call a consistent
|
||||
+ * interface.
|
||||
+ */
|
||||
+ if ((buffer_l =
|
||||
+ (short signed int *)malloc(nsamples*
|
||||
+ sizeof(short signed int))) == NULL){
|
||||
st_fail_errno(ft,ST_ENOMEM,"Memory allocation failed");
|
||||
goto end4;
|
||||
}
|
||||
|
||||
- if (ft->info.channels==2){ /* Why isn't there a lame_encode_buffer_long_interleaved? */
|
||||
- if ( (buffer_l=(long*)malloc(nsamples*sizeof(long))) == NULL){
|
||||
+ if (ft->info.channels == 2){
|
||||
+ /* lame doesn't support iterleaved samples so we must break
|
||||
+ * them out into seperate buffers.
|
||||
+ */
|
||||
+ if ((buffer_r =
|
||||
+ (short signed int *)malloc(nsamples*
|
||||
+ sizeof(short signed int))) == NULL){
|
||||
st_fail_errno(ft,ST_ENOMEM,"Memory allocation failed");
|
||||
goto end3;
|
||||
}
|
||||
+
|
||||
j=0;
|
||||
- for (i=0;i<nsamples;i++){
|
||||
- buffer_l[i]=(long)buf[j++]; /* Should we paranoically check whether long is actually 32 bits? */
|
||||
- buffer_r[i]=(long)buf[j++];
|
||||
+ for (i=0; i<nsamples; i++){
|
||||
+ buffer_l[i]=ST_SAMPLE_TO_SIGNED_WORD(buf[j++]);
|
||||
+ buffer_r[i]=ST_SAMPLE_TO_SIGNED_WORD(buf[j++]);
|
||||
}
|
||||
}
|
||||
else{
|
||||
- buffer_l=(long*)buf;
|
||||
- memset(buffer_r,0,nsamples*sizeof(long));
|
||||
+ j=0;
|
||||
+ for (i=0; i<nsamples; i++)
|
||||
+ buffer_l[i]=ST_SAMPLE_TO_SIGNED_WORD(buf[j++]);
|
||||
}
|
||||
|
||||
mp3buffer_size=1.25*nsamples + 7200;
|
||||
@@ -456,12 +481,9 @@ st_ssize_t st_mp3write(ft_t ft, st_sample_t *buf, st_s
|
||||
goto end2;
|
||||
}
|
||||
|
||||
- if ( (written = lame_encode_buffer_long2(p->gfp,
|
||||
- buffer_l,
|
||||
- buffer_r,
|
||||
- nsamples,
|
||||
- (unsigned char *)mp3buffer,
|
||||
- mp3buffer_size)) < 0){
|
||||
+ if ( (written = lame_encode_buffer(p->gfp, buffer_l, buffer_r,
|
||||
+ nsamples, (unsigned char *)mp3buffer,
|
||||
+ mp3buffer_size)) < 0){
|
||||
st_fail_errno(ft,ST_EOF,"Encoding failed");
|
||||
goto end;
|
||||
}
|
||||
@@ -477,9 +499,9 @@ st_ssize_t st_mp3write(ft_t ft, st_sample_t *buf, st_s
|
||||
free(mp3buffer);
|
||||
end2:
|
||||
if (ft->info.channels == 2)
|
||||
- free(buffer_l);
|
||||
+ free(buffer_r);
|
||||
end3:
|
||||
- free(buffer_r);
|
||||
+ free(buffer_l);
|
||||
end4:
|
||||
return done;
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user