X-Git-Url: https://git.distorted.org.uk/~mdw/disorder/blobdiff_plain/b50cfb8a0d4fc71877ae0bfcd7b28879886a2ac1..c0f84b88cab9518d29900e02a9fb67776820e902:/lib/uaudio.c diff --git a/lib/uaudio.c b/lib/uaudio.c index 2f6b67c..a9ac103 100644 --- a/lib/uaudio.c +++ b/lib/uaudio.c @@ -1,6 +1,6 @@ /* * This file is part of DisOrder. - * Copyright (C) 2009 Richard Kettlewell + * Copyright (C) 2009, 2013 Richard Kettlewell * * 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 @@ -11,7 +11,7 @@ * 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, see . */ @@ -24,6 +24,7 @@ #include "uaudio.h" #include "hash.h" #include "mem.h" +#include "log.h" /** @brief Options for chosen uaudio API */ static hash *uaudio_options; @@ -40,6 +41,9 @@ int uaudio_channels; /** @brief Whether samples are signed or unsigned */ int uaudio_signed; +/** @brief Frames of buffer to tolerate inside chosen API */ +int uaudio_buffer; + /** @brief Sample size in bytes * * NB one sample is a single point sample; up to @c uaudio_channels samples may @@ -50,6 +54,11 @@ size_t uaudio_sample_size; /** @brief Set a uaudio option */ void uaudio_set(const char *name, const char *value) { + if(!value) { + if(uaudio_options) + hash_remove(uaudio_options, name); + return; + } if(!uaudio_options) uaudio_options = hash_new(sizeof(char *)); value = xstrdup(value); @@ -58,13 +67,15 @@ void uaudio_set(const char *name, const char *value) { /** @brief Get a uaudio option */ char *uaudio_get(const char *name, const char *default_value) { - const char *value = (uaudio_options ? - *(char **)hash_find(uaudio_options, name) - : default_value); - return value ? xstrdup(value) : NULL; + if(!uaudio_options) + return default_value ? xstrdup(default_value) : 0; + char **valuep = hash_find(uaudio_options, name); + if(!valuep) + return default_value ? xstrdup(default_value) : 0; + return xstrdup(*valuep); } -/** @brief Set sample format +/** @brief Set sample format * @param rate Sample rate in KHz * @param channels Number of channels (i.e. 2 for stereo) * @param bits Number of bits per channel (typically 8 or 16) @@ -89,6 +100,21 @@ void uaudio_set_format(int rate, int channels, int bits, int signed_) { uaudio_sample_size = bits / CHAR_BIT; } +/** @brief Choose the default audio API by context + * @param apis Table of APIs or a null pointer + * @param context @ref UAUDIO_API_SERVER or @ref UAUDIO_API_CLIENT + * @return Default API or a null pointer + */ +const struct uaudio *uaudio_default(const struct uaudio *const *apis, + unsigned context) { + if(apis) { + for(int n = 0; apis[n]; ++n) + if(apis[n]->flags & context) + return apis[n]; + } + return 0; +} + /* Local Variables: c-basic-offset:2