diff --git a/src/dispatch.c b/src/dispatch.c index 1a9edf90..b2088ab6 100644 --- a/src/dispatch.c +++ b/src/dispatch.c @@ -779,7 +779,7 @@ void dispatch_stream_id(WS_CONNINFO *pwsc, int session, char *id) { session,pmp3->fname, pwsc->hostname,(long)offset); bytes_copied = plugin_ssc_transcode(pwsc,pmp3->path,pmp3->codectype, - pmp3->song_length,offset); + pmp3->song_length,offset,1); config_set_status(pwsc,session,NULL); db_dispose_item(pmp3); diff --git a/src/plugin.c b/src/plugin.c index b2bceec0..06f2bb3b 100644 --- a/src/plugin.c +++ b/src/plugin.c @@ -661,7 +661,7 @@ int _plugin_ssc_copy(WS_CONNINFO *pwsc, PLUGIN_TRANSCODE_FN *pfn, * @param duration time in ms * @returns bytes transferred, or -1 on error */ -int plugin_ssc_transcode(WS_CONNINFO *pwsc, char *file, char *codec, int duration, int offset) { +int plugin_ssc_transcode(WS_CONNINFO *pwsc, char *file, char *codec, int duration, int offset, int headers) { PLUGIN_ENTRY *ppi, *ptc=NULL; PLUGIN_TRANSCODE_FN *pfn = NULL; void *vp_ssc; @@ -691,16 +691,19 @@ int plugin_ssc_transcode(WS_CONNINFO *pwsc, char *file, char *codec, int duratio if(vp_ssc) { if(pfn->ssc_open(vp_ssc,file,codec,duration)) { /* start reading and throwing */ - ws_addresponseheader(pwsc,"Content-Type","audio/wav"); - ws_addresponseheader(pwsc,"Connection","Close"); - if(!offset) { - ws_writefd(pwsc,"HTTP/1.1 200 OK\r\n"); - } else { - ws_addresponseheader(pwsc,"Content-Range","bytes %ld-*/*", - (long)offset); - ws_writefd(pwsc,"HTTP/1.1 206 Partial Content\r\n"); + if(headers) { + ws_addresponseheader(pwsc,"Content-Type","audio/wav"); + ws_addresponseheader(pwsc,"Connection","Close"); + if(!offset) { + ws_writefd(pwsc,"HTTP/1.1 200 OK\r\n"); + } else { + ws_addresponseheader(pwsc,"Content-Range","bytes %ld-*/*", + (long)offset); + ws_writefd(pwsc,"HTTP/1.1 206 Partial Content\r\n"); + } + ws_emitheaders(pwsc); } - ws_emitheaders(pwsc); + /* start reading/writing */ result = _plugin_ssc_copy(pwsc,pfn,vp_ssc,offset); diff --git a/src/plugin.h b/src/plugin.h index 6cfe3c1d..19a50129 100644 --- a/src/plugin.h +++ b/src/plugin.h @@ -39,7 +39,7 @@ extern void plugin_event_dispatch(int event_id, int intval, void *vp, int len); /* these should really get rows */ extern int plugin_ssc_should_transcode(WS_CONNINFO *pwsc, char *codec); -extern int plugin_ssc_transcode(WS_CONNINFO *pwsc, char *file, char *codec, int duration, int offset); +extern int plugin_ssc_transcode(WS_CONNINFO *pwsc, char *file, char *codec, int duration, int offset, int headers); #define PLUGIN_E_SUCCESS 0 #define PLUGIN_E_NOLOAD 1 diff --git a/src/transcoder-driver.c b/src/transcoder-driver.c new file mode 100644 index 00000000..c55e41a0 --- /dev/null +++ b/src/transcoder-driver.c @@ -0,0 +1,110 @@ +#include +#include +#include +#include +#include + +#include "conf.h" +#include "daapd.h" +#include "err.h" +#include "os.h" +#include "plugin.h" +#include "webserver.h" + +char *av0; +CONFIG config; +char *scan_winamp_genre[] = { NULL }; + +void usage(void) { + fprintf(stderr,"Usage: %s [options]\n\n",av0); + fprintf(stderr,"options:\n\n"); + fprintf(stderr," -d level set debuglevel (9 is highest)\n"); + fprintf(stderr," -c config read config file\n"); + fprintf(stderr," -f file file to transcode\n"); + fprintf(stderr," -p plugin plugin to use\n"); + fprintf(stderr," -t codectype\n"); + + fprintf(stderr,"\n\n"); + exit(-1); +} + +int main(int argc, char *argv[]) { + int option; + int debuglevel; + char *plugin=NULL; + char *file=NULL; + char *codectype=NULL; + char *configfile="mt-daapd.conf"; + int bytes_read; + char *pe; + WS_CONNINFO wsc; + + if(strchr(argv[0],'/')) { + av0 = strrchr(argv[0],'/')+1; + } else { + av0 = argv[0]; + } + + while((option = getopt(argc, argv, "d:c:f:p:t:")) != -1) { + switch(option) { + case 'd': + debuglevel = atoi(optarg); + break; + case 'c': + configfile=optarg; + break; + case 'f': + file = optarg; + break; + case 'p': + plugin = optarg; + break; + case 't': + codectype = optarg; + break; + default: + fprintf(stderr,"Error: unknown option (%c)\n\n",option); + usage(); + } + } + + if((!plugin) || (!file) || (!codectype)) { + usage(); + } + + printf("Reading config file %s\n",configfile); + if(conf_read(configfile) != CONF_E_SUCCESS) { + fprintf(stderr,"Bummer.\n"); + exit(-1); + } + + err_setdest(LOGDEST_STDERR); + err_setlevel(debuglevel); + + plugin_init(); + if(plugin_load(&pe, plugin) != PLUGIN_E_SUCCESS) { + fprintf(stderr,"Could not load %s: %s\n",plugin, pe); + exit(-1); + } + + /* fake up a wsconninfo */ + memset(&wsc,0,sizeof(wsc)); + wsc.fd = open("out.wav",O_WRONLY | O_CREAT, 0666); + if(wsc.fd == -1) { + fprintf(stderr,"Error opening output file\n"); + exit(-1); + } + + bytes_read=plugin_ssc_transcode(&wsc,file,codectype,60*1000*3, 0,0); + close(wsc.fd); + + if(bytes_read < 1) { + fprintf(stderr,"Could not transcode\n"); + exit(-1); + } + + fprintf(stderr,"Transcoded %d bytes\n",bytes_read); + + plugin_deinit(); +} + diff --git a/src/transcoder.mk b/src/transcoder.mk new file mode 100644 index 00000000..dceef21b --- /dev/null +++ b/src/transcoder.mk @@ -0,0 +1,11 @@ +CC=gcc +CFLAGS := $(CFLAGS) -g -I/sw/include -DHAVE_CONFIG_H -I. -I.. -DHOST='"foo"' -DHAVE_SQL -DHAVE_CONFIG_H +LDFLAGS := $(LDFLAGS) -L/sw/lib -lid3tag -logg -lvorbisfile -lFLAC -lvorbis -lsqlite -lsqlite3 -lm +TARGET = transcoder +OBJECTS=transcoder-driver.o restart.o err.o os-unix.o conf.o ll.o webserver.o uici.o configfile.o plugin.o xml-rpc.o db-generic.o smart-parser.o db-sql.o db-sql-sqlite2.o db-sql-sqlite3.o dispatch.o rend-win32.o dynamic-art.o scan-aac.o + +$(TARGET): $(OBJECTS) + $(CC) -o $(TARGET) $(LDFLAGS) $(OBJECTS) + +clean: + rm -f $(OBJECTS) $(TARGET)