X-Git-Url: http://cgit.sxemacs.org/?a=blobdiff_plain;f=src%2Fmedia%2Fmedia-sox.c;h=9904777f88cd3c8d08914d6f82537cfb154acb22;hb=67bef3149361de10d38e1aeea6a1aca109930d9e;hp=6d3482f92640985e2ab4f3068953526a670b4712;hpb=5b049304111136c249b6f95e3d07b4eb526d0621;p=sxemacs
diff --git a/src/media/media-sox.c b/src/media/media-sox.c
index 6d3482f..9904777 100644
--- a/src/media/media-sox.c
+++ b/src/media/media-sox.c
@@ -29,11 +29,11 @@ along with this program. If not, see . */
#include
#include
-/*
+/*
lisp.h defined UNUSED which also gets defined in some versions of SoX
in an incompatible fashion. We don't need that macro here...
*/
-#undef UNUSED
+#undef UNUSED
#include "media-sox.h"
#define MYSELF MDRIVER_SOX
@@ -63,7 +63,7 @@ DEFINE_MEDIA_DRIVER_CUSTOM(media_sox,
/* called from util.c::st_fail() */
-void cleanup(void)
+void cleanup(void)
{
}
@@ -83,7 +83,7 @@ media_sox_open(Lisp_Media_Stream *ms)
case MKIND_FILE: {
mkind_file_properties *mkfp = NULL;
const char *file = NULL;
- int file_len = 0;
+ int file_len __attribute__((unused)) = 0;
/* open the file */
mkfp = media_stream_kind_properties(ms).fprops;
@@ -115,12 +115,8 @@ media_sox_open(Lisp_Media_Stream *ms)
}
/* retrieve the signal information */
-#if defined HAVE_STRUCT_SOX_FORMAT
+#if defined HAVE_STRUCT_SOX_FORMAT_T
stinfo = &ft->signal;
-#elif defined MEMBER_STRUCT_ST_SOUNDSTREAM_SIGNAL
- stinfo = &ft->signal;
-#elif defined MEMBER_STRUCT_ST_SOUNDSTREAM_INFO
- stinfo = &ft->info;
#else
# error "What's the matter with you?! How did you reach this?"
#endif
@@ -159,7 +155,7 @@ media_sox_open(Lisp_Media_Stream *ms)
mtap->samplewidth = 64;
mtap->framesize = mtap->channels * 8;
break;
- default:
+ default:
mtap->samplewidth = 32;
mtap->framesize = mtap->channels * 4;
break;
@@ -195,8 +191,8 @@ media_sox_close(ms_driver_data_t arg)
sxe_sox_t ft = arg;
sxe_sox_close(ft);
- SOX_DEBUG("closing SoX handle: 0x%x\n",
- (unsigned int)ft);
+ SOX_DEBUG("closing SoX handle: 0x%lx\n",
+ (unsigned long int)ft);
return;
}
@@ -209,11 +205,11 @@ media_sox_read(media_substream *mss, void *outbuf, size_t length)
/* stream stuff */
Lisp_Media_Stream *ms = mss->up;
mtype_audio_properties *mtap;
- /* libst stuff */
+ /* libsox stuff */
sxe_sox_t ft;
sxe_sox_ssize_t samples;
sxe_sox_sample_t *bptr;
- uint16_t framesize;
+ uint16_t framesize __attribute__((unused));
media_sample_format_t *fmt;
/* check the integrity of the media stream */
@@ -234,7 +230,8 @@ media_sox_read(media_substream *mss, void *outbuf, size_t length)
bptr = (sxe_sox_sample_t*)outbuf;
samples = sxe_sox_read(ft, bptr, mtap->channels*length);
- SOX_DEBUG_S("read %d samples\n", samples);
+ SOX_DEBUG_S("SoX handle: 0x%lx read %zd samples\n",
+ (unsigned long int)ft, samples);
if (samples < 0)
return 0;
@@ -249,9 +246,9 @@ media_sox_read(media_substream *mss, void *outbuf, size_t length)
static void
media_sox_rewind(media_substream *mss)
{
-/* rewind the stream to the first frame */
+ /* rewind the stream to the first frame */
Lisp_Media_Stream *ms = mss->up;
- /* libst stuff */
+ /* libsox stuff */
sxe_sox_t ft;
/* check the integrity of the media stream */
@@ -264,8 +261,47 @@ media_sox_rewind(media_substream *mss)
if (!(ft = media_stream_data(ms)))
return;
- SOX_DEBUG_S("rewind stream 0x%x\n", (unsigned int)ft);
- sxe_sox_seek(ft, 0, SEEK_SET);
+ SOX_DEBUG_S("rewind stream 0x%lx\n", (unsigned long int)ft);
+
+ /* Unfortunately it seems sex_sox_seek is broken, so we are
+ closing and reopening the stream,
+ */
+#ifdef SXE_SOX_CAN_SEEK
+ if( sxe_sox_seek(ft, 0, SOX_SEEK_SET) == 0 ) {
+ return;
+ }
+ SOX_DEBUG_S("rewind stream 0x%lx failed, trying reopen\n",
+ (unsigned long int)ft);
+#endif
+ sxe_sox_close(ft);
+ ft = NULL;
+ {
+ mkind_file_properties *mkfp = NULL;
+ const char *file = NULL;
+ int file_len __attribute__((unused)) = 0;
+
+ /* open the file */
+ mkfp = media_stream_kind_properties(ms).fprops;
+ TO_EXTERNAL_FORMAT(LISP_STRING, mkfp->filename,
+ ALLOCA, (file, file_len), Qnil);
+ if( file != NULL ) {
+#if defined HAVE_SOX_OPEN_READ_3ARGS
+ ft = sxe_sox_open_read(file, NULL, NULL);
+#elif defined HAVE_SOX_OPEN_READ_4ARGS
+ ft = sxe_sox_open_read(file, NULL, NULL, NULL);
+#else
+# error You shouldnt be here. Wake up before you try to compile me.
+#endif
+ }
+ }
+ if (!ft) {
+ media_stream_set_meths(ms, NULL);
+ media_stream_driver(ms) = MDRIVER_UNKNOWN;
+ SOX_DEBUG_S("could not reopen stream");
+ return;
+ }
+ media_stream_data(ms) = ft;
+ media_substream_data(mss) = ft;
}
#undef MYSELF