]> code.delx.au - pulseaudio/blobdiff - polyp/sound-file.c
Make the whole stuff LGPL only
[pulseaudio] / polyp / sound-file.c
index bf635fa087c19adc916b5aa41b7e2e7bc10e53e8..80233da55073653e0cc86de92bc649c674229c87 100644 (file)
@@ -1,3 +1,28 @@
+/* $Id$ */
+
+/***
+  This file is part of polypaudio.
+  polypaudio is free software; you can redistribute it and/or modify
+  it under the terms of the GNU Lesser General Public License as published
+  by the Free Software Foundation; either version 2 of the License,
+  or (at your option) any later version.
+  polypaudio 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 Lesser General Public License
+  along with polypaudio; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+  USA.
+***/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
 #include <string.h>
 #include <assert.h>
 
@@ -5,6 +30,7 @@
 
 #include "sound-file.h"
 #include "sample.h"
+#include "log.h"
 
 #define MAX_FILE_SIZE (1024*1024)
 
@@ -13,29 +39,44 @@ int pa_sound_file_load(const char *fname, struct pa_sample_spec *ss, struct pa_m
     SF_INFO sfinfo;
     int ret = -1;
     size_t l;
+    sf_count_t (*readf_function)(SNDFILE *sndfile, void *ptr, sf_count_t frames);
     assert(fname && ss && chunk);
 
-    memset(&sfinfo, 0, sizeof(sfinfo));
-
     chunk->memblock = NULL;
     chunk->index = chunk->length = 0;
-    
+
+    memset(&sfinfo, 0, sizeof(sfinfo));
+
     if (!(sf = sf_open(fname, SFM_READ, &sfinfo))) {
-        fprintf(stderr, __FILE__": Failed to open file %s\n", fname);
+        pa_log(__FILE__": Failed to open file %s\n", fname);
         goto finish;
     }
 
-    ss->format = PA_SAMPLE_FLOAT32;
+    switch (sfinfo.format & 0xFF) {
+        case SF_FORMAT_PCM_16:
+        case SF_FORMAT_PCM_U8:
+        case SF_FORMAT_ULAW:
+        case SF_FORMAT_ALAW:
+            ss->format = PA_SAMPLE_S16NE;
+            readf_function = (sf_count_t (*)(SNDFILE *sndfile, void *ptr, sf_count_t frames)) sf_readf_short;
+            break;
+        case SF_FORMAT_FLOAT:
+        default:
+            ss->format = PA_SAMPLE_FLOAT32NE;
+            readf_function = (sf_count_t (*)(SNDFILE *sndfile, void *ptr, sf_count_t frames)) sf_readf_float;
+            break;
+    }
+
     ss->rate = sfinfo.samplerate;
     ss->channels = sfinfo.channels;
 
     if (!pa_sample_spec_valid(ss)) {
-        fprintf(stderr, __FILE__": Unsupported sample format in file %s\n", fname);
+        pa_log(__FILE__": Unsupported sample format in file %s\n", fname);
         goto finish;
     }
     
     if ((l = pa_frame_size(ss)*sfinfo.frames) > MAX_FILE_SIZE) {
-        fprintf(stderr, __FILE__": File to large\n");
+        pa_log(__FILE__": File to large\n");
         goto finish;
     }
 
@@ -44,8 +85,8 @@ int pa_sound_file_load(const char *fname, struct pa_sample_spec *ss, struct pa_m
     chunk->index = 0;
     chunk->length = l;
 
-    if (sf_readf_float(sf, chunk->memblock->data, sfinfo.frames) != sfinfo.frames) {
-        fprintf(stderr, __FILE__": Premature file end\n");
+    if (readf_function(sf, chunk->memblock->data, sfinfo.frames) != sfinfo.frames) {
+        pa_log(__FILE__": Premature file end\n");
         goto finish;
     }