X-Git-Url: https://code.delx.au/pulseaudio/blobdiff_plain/4a9239f808b08cf391ded6052bab9cc499e4b505..fa499dad06ba6558111cdef64c18f2401e803cff:/polyp/sample.c diff --git a/polyp/sample.c b/polyp/sample.c index 747acf18..978a3d6a 100644 --- a/polyp/sample.c +++ b/polyp/sample.c @@ -4,7 +4,7 @@ This file is part of polypaudio. polypaudio is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published + 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. @@ -13,7 +13,7 @@ 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 + 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. @@ -26,6 +26,7 @@ #include #include #include +#include #include "sample.h" @@ -59,19 +60,19 @@ size_t pa_bytes_per_second(const struct pa_sample_spec *spec) { return spec->rate*pa_frame_size(spec); } -uint32_t pa_bytes_to_usec(size_t length, const struct pa_sample_spec *spec) { +pa_usec_t pa_bytes_to_usec(uint64_t length, const struct pa_sample_spec *spec) { assert(spec); - return (uint32_t) (((double) length/pa_frame_size(spec)*1000000)/spec->rate); + return (pa_usec_t) (((double) length/pa_frame_size(spec)*1000000)/spec->rate); } int pa_sample_spec_valid(const struct pa_sample_spec *spec) { assert(spec); - if (!spec->rate || !spec->channels) + if (spec->rate <= 0 || spec->channels <= 0) return 0; - if (spec->format >= PA_SAMPLE_MAX) + if (spec->format >= PA_SAMPLE_MAX || spec->format < 0) return 0; return 1; @@ -94,7 +95,11 @@ void pa_sample_spec_snprint(char *s, size_t l, const struct pa_sample_spec *spec [PA_SAMPLE_FLOAT32BE] = "FLOAT32BE", }; - assert(pa_sample_spec_valid(spec)); + if (!pa_sample_spec_valid(spec)) { + snprintf(s, l, "Invalid"); + return; + } + snprintf(s, l, "%s %uch %uHz", table[spec->format], spec->channels, spec->rate); } @@ -120,13 +125,53 @@ double pa_volume_to_dB(pa_volume_t v) { return 20*log10((double) v/PA_VOLUME_NORM); } -void pa_bytes_snprint(char *s, size_t l, off_t v) { - if (v >= 1024*1024*1024) - snprintf(s, l, "%0.1f GB", (double) v/1024/1024/1024); - else if (v >= 1024*1024) - snprintf(s, l, "%0.1f MB", (double) v/1024/1024); - else if (v >= 1024) - snprintf(s, l, "%0.1f KB", (double) v/1024); +#define USER_DECIBEL_RANGE 30 + +double pa_volume_to_user(pa_volume_t v) { + double dB = pa_volume_to_dB(v); + + return dB < -USER_DECIBEL_RANGE ? 0 : dB/USER_DECIBEL_RANGE+1; +} + +pa_volume_t pa_volume_from_user(double v) { + + if (v <= 0) + return PA_VOLUME_MUTED; + + return pa_volume_from_dB((v-1)*USER_DECIBEL_RANGE); +} + +void pa_bytes_snprint(char *s, size_t l, unsigned v) { + if (v >= ((unsigned) 1024)*1024*1024) + snprintf(s, l, "%0.1f GB", ((double) v)/1024/1024/1024); + else if (v >= ((unsigned) 1024)*1024) + snprintf(s, l, "%0.1f MB", ((double) v)/1024/1024); + else if (v >= (unsigned) 1024) + snprintf(s, l, "%0.1f KB", ((double) v)/1024); else snprintf(s, l, "%u B", (unsigned) v); } + +enum pa_sample_format pa_parse_sample_format(const char *format) { + + if (strcmp(format, "s16le") == 0) + return PA_SAMPLE_S16LE; + else if (strcmp(format, "s16be") == 0) + return PA_SAMPLE_S16BE; + else if (strcmp(format, "s16ne") == 0 || strcmp(format, "s16") == 0 || strcmp(format, "16") == 0) + return PA_SAMPLE_S16NE; + else if (strcmp(format, "u8") == 0 || strcmp(format, "8") == 0) + return PA_SAMPLE_U8; + else if (strcmp(format, "float32") == 0 || strcmp(format, "float32ne") == 0) + return PA_SAMPLE_FLOAT32; + else if (strcmp(format, "float32le") == 0) + return PA_SAMPLE_FLOAT32LE; + else if (strcmp(format, "float32be") == 0) + return PA_SAMPLE_FLOAT32BE; + else if (strcmp(format, "ulaw") == 0) + return PA_SAMPLE_ULAW; + else if (strcmp(format, "alaw") == 0) + return PA_SAMPLE_ALAW; + + return -1; +}