Package: daapd Version: 0.2.3d-4 Severity: wishlist Tags: patch I've added simple Ogg Vorbis support into daapd. The patch is attached. It works fine for me using an embedded client (wmamp), but unfortunately I have no other clients to test with at the moment. I'm hoping that as the maintainer you might... :-)
-- Steve McIntyre, Cambridge, UK. [EMAIL PROTECTED] Into the distance, a ribbon of black Stretched to the point of no turning back
diff -uNrbB daapd-0.2.3d/daapd.cc daapd-0.2.3d.steve/daapd.cc --- daapd-0.2.3d/daapd.cc 2004-09-08 02:15:49.000000000 +0100 +++ daapd-0.2.3d.steve/daapd.cc 2005-02-02 22:33:17.000000000 +0000 @@ -351,6 +351,10 @@ } int sendDatabaseItem( httpd *server, const Song& song ) { + if (song.format == "ogg") + httpdSetContentType ( server, "application/ogg" ); + else if (song.format == "mp3") + httpdSetContentType ( server, "audio/mpeg" ); httpdSendFile( server, (char *) song.path.c_str(), httpdRequestContentRange( server ) ); return 0; diff -uNrbB daapd-0.2.3d/daaplib/src/makefile daapd-0.2.3d.steve/daaplib/src/makefile diff -uNrbB daapd-0.2.3d/db.cc daapd-0.2.3d.steve/db.cc --- daapd-0.2.3d/db.cc 2004-09-08 02:17:58.000000000 +0100 +++ daapd-0.2.3d.steve/db.cc 2005-02-02 22:30:19.000000000 +0000 @@ -33,6 +33,8 @@ #include <id3tag.h> +pthread_mutex_t vf_mutex = PTHREAD_MUTEX_INITIALIZER; + #ifdef __APPLE__ #include <malloc/malloc.h> #else @@ -216,6 +218,96 @@ pthread_mutex_unlock(&dbLock); } +int Database::getVorbisTag( vorbis_comment* vc, char *label, std::string& out) { + char *s; + + if (vc) { + s = vorbis_comment_query(vc, label, 0); + if (s) { + out = s; + return 0; + } + } + return -1; +} + +void Database::addOgg( std::string& path, struct stat sb ) { + + Song *song = new Song; + std::string s; + FILE *fh = NULL; + OggVorbis_File vf; + vorbis_info *vi; + vorbis_comment *comment; + + if ( verbose ) printf("\t addOgg on '%s'\n", path.c_str()); + + song->present = true; + song->path = path; + song->format = "ogg"; + + song->size = sb.st_size; + song->dateadded = time( NULL ); + +#ifdef __sgi__ + song->datemodified = sb.st_mtim.tv_sec; +#elif defined(__linux__) + song->datemodified = sb.st_mtime; +#elif defined(__sun__) + song->datemodified = sb.st_mtime; +#else + song->datemodified = sb.st_mtimespec.tv_sec; +#endif + + fh = fopen(path.c_str(), "r"); + if (fh != 0) { + pthread_mutex_lock(&vf_mutex); + if (ov_open(fh, &vf, NULL, 0) == 0) { + song->time = (int)ov_time_total(&vf, -1); + if ((vi = ov_info(&vf, 0)) != NULL) { + song->bitrate = vi->bitrate_nominal/1000; + song->samplerate = vi->rate; + } + if ((comment = ov_comment(&vf, -1))) { + if (getVorbisTag(comment, "title", s) == 0) + song->name = s; + if (getVorbisTag(comment, "album", s) == 0) + song->album = s; + if (getVorbisTag(comment, "artist", s) == 0) + song->artist = s; + // No common "composer" field + if (getVorbisTag(comment, "comment", s) == 0) + song->comment = s; + if (getVorbisTag(comment, "description", s) == 0) + song->description = s; + if (getVorbisTag(comment, "genre", s) == 0) + song->genre = s; + // Ignoring "year" for now + if (getVorbisTag(comment, "tracknumber", s) == 0) + song->tracknumber = strtol(s.c_str(), NULL, 10); + } + ov_clear(&vf); + } + else + fclose(fh); + pthread_mutex_unlock(&vf_mutex); + } + + if( song->name == "" ) { + // no song title in id3 tags + // get it from file name + ComponentVect comp; + comp = *tokenizeString( comp, path.c_str(), '/' ); + song->name = comp[ comp.size() - 1 ]; + } + + song->starttime = 0; + song->stoptime = song->time; + + pthread_mutex_lock(&dbLock); + songs.add( song, path ); + pthread_mutex_unlock(&dbLock); +} void Database::addTagless( std::string& path, struct stat sb, int fileType ) { Song *song = new Song; @@ -443,6 +535,9 @@ } else if( strncasecmp( pointPos, ".m4p", 4 ) == 0) { close( fDesc ); return( DAAP_M4A ); + } else if( strncasecmp( pointPos, ".ogg", 4 ) == 0) { + close( fDesc ); + return( DAAP_OGG ); } } } @@ -469,6 +564,8 @@ } else if( strncmp( (const char *)buffer, "RIFF", 4 ) == 0 ) { if( strncmp( (const char *)buffer+8, "WAVE", 4 ) == 0 ) type = DAAP_WAV; + } else if( strncmp( (const char *)buffer, "OggS", 4 ) == 0 ) { + type = DAAP_OGG; } } @@ -500,6 +597,8 @@ addMp3( path, sb ); } else if( fileType == DAAP_M4A ) { addM4a( path, sb ); + } else if( fileType == DAAP_OGG ) { + addOgg( path, sb ); } else { addTagless( path, sb, fileType ); } @@ -512,6 +611,8 @@ addMp3( path, sb ); } else if( fileType == DAAP_M4A ) { addM4a( path, sb ); + } else if( fileType == DAAP_OGG ) { + addOgg( path, sb ); } else { addTagless( path, sb, fileType ); } @@ -546,7 +647,12 @@ if( fileType == DAAP_DIRECTORY ) { addDirectory( fileName ); - } else if( fileType == DAAP_MP3 || fileType == DAAP_AIFF || fileType == DAAP_WAV || fileType == DAAP_SD2 || fileType == DAAP_M4A ) { + } else if( fileType == DAAP_MP3 || + fileType == DAAP_AIFF || + fileType == DAAP_WAV || + fileType == DAAP_SD2 || + fileType == DAAP_M4A || + fileType == DAAP_OGG) { addRegularFile( fileName, fileType ); } } diff -uNrbB daapd-0.2.3d/makefile daapd-0.2.3d.steve/makefile --- daapd-0.2.3d/makefile 2004-09-08 02:17:58.000000000 +0100 +++ daapd-0.2.3d.steve/makefile 2005-01-29 23:26:32.000000000 +0000 @@ -13,15 +13,15 @@ TARGET = daapd DEPS = daaplib_ libhttpd_ OBJS = daapd.o db.o dboutput.o songcache.o parsemp3.o -LIBS = -ldaaplib -lhttpd-persistent -lid3tag -lz -lpthread -LIBPATH = -L. -L./daaplib/src -L./libhttpd/src -L/usr/local/lib -INCPATH = -I. -I./daaplib/include -I./libhttpd/src -I/usr/local/include -DEPLOY = /usr/local +LIBS = -ldaaplib -lhttpd-persistent -lid3tag -lz -lpthread -lvorbis -lvorbisfile +LIBPATH = -L. -L./daaplib/src -L./libhttpd/src +INCPATH = -I. -I./daaplib/include -I./libhttpd/src +DEPLOY = $(DESTDIR)/usr CFLAGS = -Wall -Wno-multichar # HOWL ifeq ($(HOWL_ENABLE),1) - HOWLDIRS := $(sort $(wildcard /usr/local/include/howl*) ) + HOWLDIRS := $(sort $(wildcard /usr/include/howl*) ) ifeq ($(words $(HOWLDIRS) ), 0) $(error howl not found in /usr/local/include. Install howl or disable it in the makefile) endif diff -uNrbB daapd-0.2.3d/types.h daapd-0.2.3d.steve/types.h --- daapd-0.2.3d/types.h 2005-02-02 22:32:19.000000000 +0000 +++ daapd-0.2.3d.steve/types.h 2005-02-02 22:30:39.000000000 +0000 @@ -34,6 +34,7 @@ #include <pthread.h> #include <id3tag.h> +#include <vorbis/vorbisfile.h> #include <daap/tagoutput.h> #include "dboutput.h" @@ -158,6 +159,7 @@ const int DAAP_WAV = 5; const int DAAP_SD2 = 6; const int DAAP_M4A = 7; +const int DAAP_OGG = 8; // utility stuff @@ -301,7 +302,11 @@ if( fileType == DAAP_DIRECTORY ) { addDirectory( (*dirs)[i] ); - } else if( fileType == DAAP_MP3 || fileType == DAAP_AIFF || fileType == DAAP_WAV || fileType == DAAP_AIFF ) { + } else if( fileType == DAAP_MP3 || + fileType == DAAP_AIFF || + fileType == DAAP_WAV || + fileType == DAAP_AIFF || + fileType == DAAP_OGG ) { addRegularFile( (*dirs)[i], fileType ); } } @@ -379,7 +384,9 @@ int getId3TextFrame( id3_tag* tag, const char* frameId, std::string& out, bool allStrings ); int getId3Comment( id3_tag* tag, std::string& out); + int getVorbisTag( vorbis_comment* vc, char *label, std::string& out); void addMp3( std::string& path, struct stat sb ); + void addOgg( std::string& path, struct stat sb ); void addM4a( std::string& path, struct stat sb ); void addTagless( std::string& path, struct stat sb, int fileType); int getFileType( std::string& fileName );
signature.asc
Description: Digital signature