From ecec767f170d8f9f295f3e0f64c1570c738fcfb1 Mon Sep 17 00:00:00 2001 From: Justin Maggard Date: Mon, 12 Oct 2009 21:07:14 +0000 Subject: [PATCH] * Add PCM support, assuming defaults of 44.1K and 2 channels. --- metadata.c | 5 +++++ tagutils/tagutils-pcm.c | 50 +++++++++++++++++++++++++++++++++++++++++ tagutils/tagutils-pcm.h | 22 ++++++++++++++++++ tagutils/tagutils.c | 3 +++ utils.c | 3 ++- 5 files changed, 82 insertions(+), 1 deletion(-) create mode 100644 tagutils/tagutils-pcm.c create mode 100644 tagutils/tagutils-pcm.h diff --git a/metadata.c b/metadata.c index 1ab2ec3..757d06e 100644 --- a/metadata.c +++ b/metadata.c @@ -190,6 +190,11 @@ GetAudioMetadata(const char * path, char * name) strcpy(type, "ogg"); strcpy(mime, "application/ogg"); } + else if( ends_with(path, ".pcm") ) + { + strcpy(type, "pcm"); + strcpy(mime, "audio/L16"); + } else { DPRINTF(E_WARN, L_GENERAL, "Unhandled file extension on %s\n", path); diff --git a/tagutils/tagutils-pcm.c b/tagutils/tagutils-pcm.c new file mode 100644 index 0000000..5d221d6 --- /dev/null +++ b/tagutils/tagutils-pcm.c @@ -0,0 +1,50 @@ +//========================================================================= +// FILENAME : tagutils-pcm.c +// DESCRIPTION : Return default PCM values. +//========================================================================= +// Copyright (c) 2009 NETGEAR, Inc. All Rights Reserved. +// based on software from Ron Pedde's FireFly Media Server project +//========================================================================= + +/* + * 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 + */ + +static int +_get_pcmfileinfo(char *filename, struct song_metadata *psong) +{ + struct stat file; + uint32_t sec, ms; + + if( stat(filename, &file) != 0 ) + { + DPRINTF(E_WARN, L_SCANNER, "Could not stat %s\n", filename); + return -1; + } + + psong->file_size = file.st_size; + psong->bitrate = 1411200; + psong->samplerate = 44100; + psong->channels = 2; + sec = psong->file_size / (psong->bitrate / 8); + ms = ((psong->file_size % (psong->bitrate / 8)) * 1000) / (psong->bitrate / 8); + psong->song_length = (sec * 1000) + ms; + psong->lossless = 1; + + asprintf(&(psong->mime), "audio/L16;rate=%d;channels=%d", psong->samplerate, psong->channels); + asprintf(&(psong->dlna_pn), "LPCM"); + + return 0; +} diff --git a/tagutils/tagutils-pcm.h b/tagutils/tagutils-pcm.h new file mode 100644 index 0000000..d25d950 --- /dev/null +++ b/tagutils/tagutils-pcm.h @@ -0,0 +1,22 @@ +//========================================================================= +// FILENAME : tagutils-pcm.h +//========================================================================= +// Copyright (c) 2009- NETGEAR, Inc. All Rights Reserved. +//========================================================================= + +/* 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 + */ + +static int _get_pcmfileinfo(char *file, struct song_metadata *psong); diff --git a/tagutils/tagutils.c b/tagutils/tagutils.c index 3251311..2ef57a9 100644 --- a/tagutils/tagutils.c +++ b/tagutils/tagutils.c @@ -106,6 +106,7 @@ char *winamp_genre[] = { #include "tagutils-flc.h" #include "tagutils-asf.h" #include "tagutils-wav.h" +#include "tagutils-pcm.h" static int _get_tags(char *file, struct song_metadata *psong); static int _get_fileinfo(char *file, struct song_metadata *psong); @@ -128,6 +129,7 @@ static taghandler taghandlers[] = { { "ogg", 0, _get_oggfileinfo }, { "asf", 0, _get_asffileinfo }, { "wav", _get_wavtags, _get_wavfileinfo }, + { "pcm", 0, _get_pcmfileinfo }, { NULL, 0 } }; @@ -141,6 +143,7 @@ static taghandler taghandlers[] = { #include "tagutils-flc.c" #include "tagutils-asf.c" #include "tagutils-wav.c" +#include "tagutils-pcm.c" //********************************************************************************* // freetags() diff --git a/utils.c b/utils.c index 254f87b..4ab61ad 100644 --- a/utils.c +++ b/utils.c @@ -196,7 +196,8 @@ is_audio(const char * file) ends_with(file, ".fla") || ends_with(file, ".flc") || ends_with(file, ".m4a") || ends_with(file, ".aac") || ends_with(file, ".mp4") || ends_with(file, ".m4p") || - ends_with(file, ".wav") || ends_with(file, ".ogg")); + ends_with(file, ".wav") || ends_with(file, ".ogg") || + ends_with(file, ".pcm")); } int