From 5d392c70cbea09d81e6e5bb7f0a0bd075fcd6f8d Mon Sep 17 00:00:00 2001 From: Warren Dukes Date: Mon, 31 May 2004 02:31:55 +0000 Subject: audiofile_plugin git-svn-id: https://svn.musicpd.org/mpd/trunk@1248 09075e82-0dd4-0310-85a5-a0d7c8717e4f --- src/Makefile.am | 6 +- src/audiofile_decode.c | 143 ---------------------------- src/audiofile_decode.h | 36 -------- src/inputPlugin.c | 2 + src/inputPlugins/audiofile_plugin.c | 180 ++++++++++++++++++++++++++++++++++++ src/tag.c | 19 ---- 6 files changed, 185 insertions(+), 201 deletions(-) delete mode 100644 src/audiofile_decode.c delete mode 100644 src/audiofile_decode.h create mode 100644 src/inputPlugins/audiofile_plugin.c diff --git a/src/Makefile.am b/src/Makefile.am index 39706f692..478b6c2ef 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -2,13 +2,13 @@ bin_PROGRAMS = mpd SUBDIRS = $(ID3_SUBDIR) $(MAD_SUBDIR) $(MP4FF_SUBDIR) mpd_inputPlugins = inputPlugins/mp3_plugin.c inputPlugins/ogg_plugin.c \ - inputPlugins/flac_plugin.c + inputPlugins/flac_plugin.c inputPlugins/audiofile_plugin.c mpd_headers = buffer2array.h interface.h command.h playlist.h ls.h \ song.h list.h directory.h tables.h utils.h path.h \ tag.h player.h listen.h conf.h volume.h \ audio.h playerData.h stats.h myfprintf.h sig_handlers.h decode.h log.h \ - audiofile_decode.h charConv.h permission.h mpd_types.h pcm_utils.h \ + charConv.h permission.h mpd_types.h pcm_utils.h \ mp4_decode.h aac_decode.h signal_check.h utf8.h inputStream.h \ outputBuffer.h replayGain.h inputStream_file.h inputStream_http.h \ inputPlugin.h @@ -16,7 +16,7 @@ mpd_SOURCES = main.c buffer2array.c interface.c command.c playlist.c ls.c \ song.c list.c directory.c tables.c utils.c path.c \ tag.c player.c listen.c conf.c volume.c \ audio.c playerData.c stats.c myfprintf.c sig_handlers.c decode.c log.c \ - audiofile_decode.c charConv.c permission.c pcm_utils.c mp4_decode.c \ + charConv.c permission.c pcm_utils.c mp4_decode.c \ aac_decode.c signal_check.c utf8.c inputStream.c outputBuffer.c \ replayGain.c inputStream_file.c inputStream_http.c inputPlugin.c \ $(mpd_headers) $(mpd_inputPlugins) diff --git a/src/audiofile_decode.c b/src/audiofile_decode.c deleted file mode 100644 index 8e6c779b9..000000000 --- a/src/audiofile_decode.c +++ /dev/null @@ -1,143 +0,0 @@ -/* the Music Player Daemon (MPD) - * (c)2003-2004 by Warren Dukes (shank@mercury.chem.pitt.edu) - * This project's homepage is: http://www.musicpd.org - * - * libaudiofile (wave) support added by Eric Wong - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include "audiofile_decode.h" - -#ifdef HAVE_AUDIOFILE - -#include "command.h" -#include "utils.h" -#include "audio.h" -#include "log.h" -#include "pcm_utils.h" - -#include -#include -#include -#include -#include -#include -#include -#include - -int getAudiofileTotalTime(char * file) -{ - int time; - AFfilehandle af_fp = afOpenFile(file, "r", NULL); - if(af_fp == AF_NULL_FILEHANDLE) { - return -1; - } - time = (int) - ((double)afGetFrameCount(af_fp,AF_DEFAULT_TRACK) - /afGetRate(af_fp,AF_DEFAULT_TRACK)); - afCloseFile(af_fp); - return time; -} - -int audiofile_decode(OutputBuffer * cb, DecoderControl * dc) { - int fs, frame_count; - AFfilehandle af_fp; - int bits; - mpd_uint16 bitRate; - struct stat st; - - if(stat(dc->file,&st) < 0) { - ERROR("failed to stat: %s\n",dc->file); - return -1; - } - - af_fp = afOpenFile(dc->file,"r", NULL); - if(af_fp == AF_NULL_FILEHANDLE) { - ERROR("failed to open: %s\n",dc->file); - return -1; - } - - afGetSampleFormat(af_fp, AF_DEFAULT_TRACK, &fs, &bits); - dc->audioFormat.bits = bits; - dc->audioFormat.sampleRate = afGetRate(af_fp, AF_DEFAULT_TRACK); - dc->audioFormat.channels = afGetChannels(af_fp,AF_DEFAULT_TRACK); - getOutputAudioFormat(&(dc->audioFormat),&(cb->audioFormat)); - - frame_count = afGetFrameCount(af_fp,AF_DEFAULT_TRACK); - - dc->totalTime = ((float)frame_count/(float)dc->audioFormat.sampleRate); - - bitRate = st.st_size*8.0/dc->totalTime/1000.0+0.5; - - if (dc->audioFormat.bits != 8 && dc->audioFormat.bits != 16) { - ERROR("Only 8 and 16-bit files are supported. %s is %i-bit\n", - dc->file,dc->audioFormat.bits); - afCloseFile(af_fp); - return -1; - } - - fs = (int)afGetFrameSize(af_fp, AF_DEFAULT_TRACK,1); - - dc->state = DECODE_STATE_DECODE; - { - int ret, eof = 0, current = 0; - unsigned char chunk[CHUNK_SIZE]; - - while(!eof) { - if(dc->seek) { - clearOutputBuffer(cb); - current = dc->seekWhere * - dc->audioFormat.sampleRate; - afSeekFrame(af_fp, AF_DEFAULT_TRACK,current); - dc->seek = 0; - } - - ret = afReadFrames(af_fp, AF_DEFAULT_TRACK, chunk, CHUNK_SIZE/fs); - if(ret<=0) eof = 1; - else { - current += ret; - sendDataToOutputBuffer(cb, - NULL, - dc, - 1, - chunk, - ret*fs, - (float)current / - (float)dc->audioFormat.sampleRate, - bitRate); - if(dc->stop) break; - } - } - - flushOutputBuffer(cb); - - /*if(dc->seek) { - dc->seekError = 1; - dc->seek = 0; - }*/ - - if(dc->stop) { - dc->state = DECODE_STATE_STOP; - dc->stop = 0; - } - else dc->state = DECODE_STATE_STOP; - } - afCloseFile(af_fp); - - return 0; -} - -#endif /* HAVE_AUDIOFILE */ -/* vim:set shiftwidth=4 tabstop=8 expandtab: */ diff --git a/src/audiofile_decode.h b/src/audiofile_decode.h deleted file mode 100644 index 82dc565ec..000000000 --- a/src/audiofile_decode.h +++ /dev/null @@ -1,36 +0,0 @@ -/* the Music Player Daemon (MPD) - * (c)2003-2004 by Warren Dukes (shank@mercury.chem.pitt.edu) - * This project's homepage is: http://www.musicpd.org - * - * libaudiofile (wave) support added by Eric Wong - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef AUDIOFILE_DECODE_H -#define AUDIOFILE_DECODE_H - -#include "../config.h" - -#ifdef HAVE_AUDIOFILE - -#include "playerData.h" - -int audiofile_decode(OutputBuffer * cb, DecoderControl * dc); - -int getAudiofileTotalTime(char * file); - -#endif /* HAVE_AUDIOFILE */ -#endif /* AUDIOFILE_DECODE_H */ -/* vim:set shiftwidth=4 tabstop=8 expandtab: */ diff --git a/src/inputPlugin.c b/src/inputPlugin.c index 325ebfcfd..2295f7b51 100644 --- a/src/inputPlugin.c +++ b/src/inputPlugin.c @@ -70,6 +70,7 @@ InputPlugin * getInputPluginFromName(char * name) { extern InputPlugin mp3Plugin; extern InputPlugin oggPlugin; extern InputPlugin flacPlugin; +extern InputPlugin audiofilePlugin; void initInputPlugins() { inputPlugin_list = makeList(NULL); @@ -78,6 +79,7 @@ void initInputPlugins() { loadInputPlugin(&mp3Plugin); loadInputPlugin(&oggPlugin); loadInputPlugin(&flacPlugin); + loadInputPlugin(&audiofilePlugin); } void finishInputPlugins() { diff --git a/src/inputPlugins/audiofile_plugin.c b/src/inputPlugins/audiofile_plugin.c new file mode 100644 index 000000000..8c1089e1b --- /dev/null +++ b/src/inputPlugins/audiofile_plugin.c @@ -0,0 +1,180 @@ +/* the Music Player Daemon (MPD) + * (c)2003-2004 by Warren Dukes (shank@mercury.chem.pitt.edu) + * This project's homepage is: http://www.musicpd.org + * + * libaudiofile (wave) support added by Eric Wong + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "../inputPlugin.h" + +#ifdef HAVE_AUDIOFILE + +#include "../utils.h" +#include "../audio.h" +#include "../log.h" +#include "../pcm_utils.h" +#include "../playerData.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +int getAudiofileTotalTime(char * file) +{ + int time; + AFfilehandle af_fp = afOpenFile(file, "r", NULL); + if(af_fp == AF_NULL_FILEHANDLE) { + return -1; + } + time = (int) + ((double)afGetFrameCount(af_fp,AF_DEFAULT_TRACK) + /afGetRate(af_fp,AF_DEFAULT_TRACK)); + afCloseFile(af_fp); + return time; +} + +int audiofile_decode(OutputBuffer * cb, DecoderControl * dc) { + int fs, frame_count; + AFfilehandle af_fp; + int bits; + mpd_uint16 bitRate; + struct stat st; + + if(stat(dc->file,&st) < 0) { + ERROR("failed to stat: %s\n",dc->file); + return -1; + } + + af_fp = afOpenFile(dc->file,"r", NULL); + if(af_fp == AF_NULL_FILEHANDLE) { + ERROR("failed to open: %s\n",dc->file); + return -1; + } + + afGetSampleFormat(af_fp, AF_DEFAULT_TRACK, &fs, &bits); + dc->audioFormat.bits = bits; + dc->audioFormat.sampleRate = afGetRate(af_fp, AF_DEFAULT_TRACK); + dc->audioFormat.channels = afGetChannels(af_fp,AF_DEFAULT_TRACK); + getOutputAudioFormat(&(dc->audioFormat),&(cb->audioFormat)); + + frame_count = afGetFrameCount(af_fp,AF_DEFAULT_TRACK); + + dc->totalTime = ((float)frame_count/(float)dc->audioFormat.sampleRate); + + bitRate = st.st_size*8.0/dc->totalTime/1000.0+0.5; + + if (dc->audioFormat.bits != 8 && dc->audioFormat.bits != 16) { + ERROR("Only 8 and 16-bit files are supported. %s is %i-bit\n", + dc->file,dc->audioFormat.bits); + afCloseFile(af_fp); + return -1; + } + + fs = (int)afGetFrameSize(af_fp, AF_DEFAULT_TRACK,1); + + dc->state = DECODE_STATE_DECODE; + { + int ret, eof = 0, current = 0; + unsigned char chunk[CHUNK_SIZE]; + + while(!eof) { + if(dc->seek) { + clearOutputBuffer(cb); + current = dc->seekWhere * + dc->audioFormat.sampleRate; + afSeekFrame(af_fp, AF_DEFAULT_TRACK,current); + dc->seek = 0; + } + + ret = afReadFrames(af_fp, AF_DEFAULT_TRACK, chunk, CHUNK_SIZE/fs); + if(ret<=0) eof = 1; + else { + current += ret; + sendDataToOutputBuffer(cb, + NULL, + dc, + 1, + chunk, + ret*fs, + (float)current / + (float)dc->audioFormat.sampleRate, + bitRate); + if(dc->stop) break; + } + } + + flushOutputBuffer(cb); + + /*if(dc->seek) { + dc->seekError = 1; + dc->seek = 0; + }*/ + + if(dc->stop) { + dc->state = DECODE_STATE_STOP; + dc->stop = 0; + } + else dc->state = DECODE_STATE_STOP; + } + afCloseFile(af_fp); + + return 0; +} + +MpdTag * audiofileTagDup(char * file) { + MpdTag * ret = NULL; + int time = getAudiofileTotalTime(file); + + if (time>=0) { + if(!ret) ret = newMpdTag(); + ret->time = time; + } + + return ret; +} + +char * audiofileSuffixes[] = {"wav", NULL}; + +InputPlugin audiofilePlugin = +{ + "audiofile", + NULL, + audiofile_decode, + audiofileTagDup, + INPUT_PLUGIN_STREAM_FILE, + audiofileSuffixes, + NULL +}; + +#else + +InputPlugin audiofilePlugin = +{ + NULL, + NULL, + NULL, + NULL, + 0, + NULL, + NULL +}; + +#endif /* HAVE_AUDIOFILE */ diff --git a/src/tag.c b/src/tag.c index 101c004b3..c9fcd1242 100644 --- a/src/tag.c +++ b/src/tag.c @@ -19,9 +19,6 @@ #include "tag.h" #include "path.h" #include "myfprintf.h" -#include "audiofile_decode.h" -#include "mp4_decode.h" -#include "aac_decode.h" #include "utils.h" #include "utf8.h" #include "log.h" @@ -154,22 +151,6 @@ MpdTag * id3Dup(char * file) { return ret; } -#ifdef HAVE_AUDIOFILE -MpdTag * audiofileTagDup(char * utf8file) { - MpdTag * ret = NULL; - int time = getAudiofileTotalTime(rmp2amp(utf8ToFsCharset(utf8file))); - - if (time>=0) { - if(!ret) ret = newMpdTag(); - ret->time = time; - } - - if(ret) validateUtf8Tag(ret); - - return ret; -} -#endif - #ifdef HAVE_FAAD MpdTag * aacTagDup(char * utf8file) { MpdTag * ret = NULL; -- cgit v1.2.3