From 2f387d2aa149118bec4c436056fc06d7c2f427c4 Mon Sep 17 00:00:00 2001 From: Taylor Holberton Date: Thu, 1 Dec 2016 15:58:16 -0800 Subject: Added const specifier in several functions Functions changed are: - pcm_params_get_mask - pcm_params_get_min - pcm_params_get_max - param_get_mask - param_get_min - param_get_max --- src/pcm.c | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) (limited to 'src') diff --git a/src/pcm.c b/src/pcm.c index 1ce1a54..73debb4 100644 --- a/src/pcm.c +++ b/src/pcm.c @@ -64,6 +64,11 @@ static inline int param_is_interval(int p) (p <= SNDRV_PCM_HW_PARAM_LAST_INTERVAL); } +static inline const struct snd_interval *param_get_interval(const struct snd_pcm_hw_params *p, int n) +{ + return &(p->intervals[n - SNDRV_PCM_HW_PARAM_FIRST_INTERVAL]); +} + static inline struct snd_interval *param_to_interval(struct snd_pcm_hw_params *p, int n) { return &(p->intervals[n - SNDRV_PCM_HW_PARAM_FIRST_INTERVAL]); @@ -94,19 +99,19 @@ static void param_set_min(struct snd_pcm_hw_params *p, int n, unsigned int val) } } -static unsigned int param_get_min(struct snd_pcm_hw_params *p, int n) +static unsigned int param_get_min(const struct snd_pcm_hw_params *p, int n) { if (param_is_interval(n)) { - struct snd_interval *i = param_to_interval(p, n); + const struct snd_interval *i = param_get_interval(p, n); return i->min; } return 0; } -static unsigned int param_get_max(struct snd_pcm_hw_params *p, int n) +static unsigned int param_get_max(const struct snd_pcm_hw_params *p, int n) { if (param_is_interval(n)) { - struct snd_interval *i = param_to_interval(p, n); + const struct snd_interval *i = param_get_interval(p, n); return i->max; } return 0; @@ -696,7 +701,7 @@ static int pcm_param_to_alsa(enum pcm_param param) * Otherwise, the mask associated with @p param is returned. * @ingroup libtinyalsa-pcm */ -struct pcm_mask *pcm_params_get_mask(struct pcm_params *pcm_params, +const struct pcm_mask *pcm_params_get_mask(const struct pcm_params *pcm_params, enum pcm_param param) { int p; @@ -710,7 +715,7 @@ struct pcm_mask *pcm_params_get_mask(struct pcm_params *pcm_params, return NULL; } - return (struct pcm_mask *)param_to_mask(params, p); + return (const struct pcm_mask *)param_to_mask(params, p); } /** Get the minimum of a specified PCM parameter. @@ -719,7 +724,7 @@ struct pcm_mask *pcm_params_get_mask(struct pcm_params *pcm_params, * @returns On success, the parameter minimum. * On failure, zero. */ -unsigned int pcm_params_get_min(struct pcm_params *pcm_params, +unsigned int pcm_params_get_min(const struct pcm_params *pcm_params, enum pcm_param param) { struct snd_pcm_hw_params *params = (struct snd_pcm_hw_params *)pcm_params; @@ -741,10 +746,10 @@ unsigned int pcm_params_get_min(struct pcm_params *pcm_params, * @returns On success, the parameter maximum. * On failure, zero. */ -unsigned int pcm_params_get_max(struct pcm_params *pcm_params, +unsigned int pcm_params_get_max(const struct pcm_params *pcm_params, enum pcm_param param) { - struct snd_pcm_hw_params *params = (struct snd_pcm_hw_params *)pcm_params; + const struct snd_pcm_hw_params *params = (const struct snd_pcm_hw_params *)pcm_params; int p; if (!params) -- cgit v1.2.3 From 94803b005511f8baf3281ec4e922be99f62b4186 Mon Sep 17 00:00:00 2001 From: Taylor Holberton Date: Thu, 1 Dec 2016 16:07:14 -0800 Subject: Added const specifier in pcm_open Added const specifier to the struct pcm_config argument. Changed the way default values of the config structure are set and accessed. They're accessed through the pointer from the argument list and set through the pointer in the pcm structure. --- src/pcm.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) (limited to 'src') diff --git a/src/pcm.c b/src/pcm.c index 73debb4..29c69a7 100644 --- a/src/pcm.c +++ b/src/pcm.c @@ -808,7 +808,7 @@ int pcm_close(struct pcm *pcm) * @ingroup libtinyalsa-pcm */ struct pcm *pcm_open(unsigned int card, unsigned int device, - unsigned int flags, struct pcm_config *config) + unsigned int flags, const struct pcm_config *config) { struct pcm *pcm; struct snd_pcm_info info; @@ -823,14 +823,14 @@ struct pcm *pcm_open(unsigned int card, unsigned int device, if (config == NULL) { config = &pcm->config; - config->channels = 2; - config->rate = 48000; - config->period_size = 1024; - config->period_count = 4; - config->format = PCM_FORMAT_S16_LE; - config->start_threshold = config->period_count * config->period_size; - config->stop_threshold = config->period_count * config->period_size; - config->silence_threshold = 0; + pcm->config.channels = 2; + pcm->config.rate = 48000; + pcm->config.period_size = 1024; + pcm->config.period_count = 4; + pcm->config.format = PCM_FORMAT_S16_LE; + pcm->config.start_threshold = config->period_count * config->period_size; + pcm->config.stop_threshold = config->period_count * config->period_size; + pcm->config.silence_threshold = 0; } else { pcm->config = *config; } @@ -890,8 +890,8 @@ struct pcm *pcm_open(unsigned int card, unsigned int device, } /* get our refined hw_params */ - config->period_size = param_get_int(¶ms, SNDRV_PCM_HW_PARAM_PERIOD_SIZE); - config->period_count = param_get_int(¶ms, SNDRV_PCM_HW_PARAM_PERIODS); + pcm->config.period_size = param_get_int(¶ms, SNDRV_PCM_HW_PARAM_PERIOD_SIZE); + pcm->config.period_count = param_get_int(¶ms, SNDRV_PCM_HW_PARAM_PERIODS); pcm->buffer_size = config->period_count * config->period_size; if (flags & PCM_MMAP) { -- cgit v1.2.3 From 15d58481e7633281e4d13fdabd12e1cec2605752 Mon Sep 17 00:00:00 2001 From: Taylor Holberton Date: Thu, 1 Dec 2016 17:46:29 -0800 Subject: added const specifier in function, pcm_is_ready --- src/pcm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/pcm.c b/src/pcm.c index 29c69a7..c32e8ab 100644 --- a/src/pcm.c +++ b/src/pcm.c @@ -979,7 +979,7 @@ fail_close: * Otherwise, the function returns one. * @ingroup libtinyalsa-pcm */ -int pcm_is_ready(struct pcm *pcm) +int pcm_is_ready(const struct pcm *pcm) { return pcm->fd >= 0; } -- cgit v1.2.3 From 147d7adec6ff293be328d6da2eb0d8d2419e9b34 Mon Sep 17 00:00:00 2001 From: Taylor Holberton Date: Thu, 1 Dec 2016 17:50:31 -0800 Subject: Added const specifier in several functions pcm_get_file_descriptor pcm_get_error pcm_get_buffer_size pcm_frames_to_bytes pcm_bytes_to_frames pcm_get_subdevice --- src/pcm.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/pcm.c b/src/pcm.c index c32e8ab..540fd72 100644 --- a/src/pcm.c +++ b/src/pcm.c @@ -199,7 +199,7 @@ struct pcm { * @return The buffer size of the PCM. * @ingroup libtinyalsa-pcm */ -unsigned int pcm_get_buffer_size(struct pcm *pcm) +unsigned int pcm_get_buffer_size(const struct pcm *pcm) { return pcm->buffer_size; } @@ -210,7 +210,7 @@ unsigned int pcm_get_buffer_size(struct pcm *pcm) * @return The file descriptor of the PCM. * @ingroup libtinyalsa-pcm */ -int pcm_get_file_descriptor(struct pcm *pcm) +int pcm_get_file_descriptor(const struct pcm *pcm) { return pcm->fd; } @@ -221,7 +221,7 @@ int pcm_get_file_descriptor(struct pcm *pcm) * @return The error message of the last error that occured. * @ingroup libtinyalsa-pcm */ -const char* pcm_get_error(struct pcm *pcm) +const char* pcm_get_error(const struct pcm *pcm) { return pcm->error; } @@ -229,7 +229,7 @@ const char* pcm_get_error(struct pcm *pcm) /** Gets the subdevice on which the pcm has been opened. * @param pcm A PCM handle. * @return The subdevice on which the pcm has been opened */ -unsigned int pcm_get_subdevice(struct pcm *pcm) +unsigned int pcm_get_subdevice(const struct pcm *pcm) { return pcm->subdevice; } @@ -311,7 +311,7 @@ unsigned int pcm_format_to_bits(enum pcm_format format) * @return The number of frames that may fit into @p bytes * @ingroup libtinyalsa-pcm */ -unsigned int pcm_bytes_to_frames(struct pcm *pcm, unsigned int bytes) +unsigned int pcm_bytes_to_frames(const struct pcm *pcm, unsigned int bytes) { return bytes / (pcm->config.channels * (pcm_format_to_bits(pcm->config.format) >> 3)); @@ -323,7 +323,7 @@ unsigned int pcm_bytes_to_frames(struct pcm *pcm, unsigned int bytes) * @return The bytes occupied by @p frames. * @ingroup libtinyalsa-pcm */ -unsigned int pcm_frames_to_bytes(struct pcm *pcm, unsigned int frames) +unsigned int pcm_frames_to_bytes(const struct pcm *pcm, unsigned int frames) { return frames * pcm->config.channels * (pcm_format_to_bits(pcm->config.format) >> 3); -- cgit v1.2.3 From cac43a208d0297a55876c5926eefc1c2ab195067 Mon Sep 17 00:00:00 2001 From: Taylor Holberton Date: Thu, 1 Dec 2016 18:11:24 -0800 Subject: Added const specifier for several mixer functions Functions changed are: - mixer_get_name - mixer_get_num_ctls - mixer_ctl_get_id - mixer_ctl_get_name - mixer_ctl_get_type - mixer_ctl_get_type_string - mixer_ctl_get_num_values - mixer_ctl_get_num_enums - mixer_ctl_get_enum_string - mixer_ctl_get_percent - mixer_ctl_get_value - mixer_ctl_get_array - mixer_ctl_get_range_min - mixer_ctl_get_range_max --- src/mixer.c | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) (limited to 'src') diff --git a/src/mixer.c b/src/mixer.c index 0fe9c99..5fed4a8 100644 --- a/src/mixer.c +++ b/src/mixer.c @@ -176,7 +176,7 @@ fail: * @returns The name of the mixer's card. * @ingroup libtinyalsa-mixer */ -const char *mixer_get_name(struct mixer *mixer) +const char *mixer_get_name(const struct mixer *mixer) { return (const char *)mixer->card_info.name; } @@ -186,7 +186,7 @@ const char *mixer_get_name(struct mixer *mixer) * @returns The number of mixer controls for the given mixer. * @ingroup libtinyalsa-mixer */ -unsigned int mixer_get_num_ctls(struct mixer *mixer) +unsigned int mixer_get_num_ctls(const struct mixer *mixer) { if (!mixer) return 0; @@ -263,7 +263,7 @@ void mixer_ctl_update(struct mixer_ctl *ctl) * On error, UINT_MAX is returned instead. * @ingroup libtinyalsa-mixer */ -unsigned int mixer_ctl_get_id(struct mixer_ctl *ctl) +unsigned int mixer_ctl_get_id(const struct mixer_ctl *ctl) { if (!ctl) return UINT_MAX; @@ -280,7 +280,7 @@ unsigned int mixer_ctl_get_id(struct mixer_ctl *ctl) * On error, NULL. * @ingroup libtinyalsa-mixer */ -const char *mixer_ctl_get_name(struct mixer_ctl *ctl) +const char *mixer_ctl_get_name(const struct mixer_ctl *ctl) { if (!ctl) return NULL; @@ -294,7 +294,7 @@ const char *mixer_ctl_get_name(struct mixer_ctl *ctl) * On failure, it returns @ref MIXER_CTL_TYPE_UNKNOWN * @ingroup libtinyalsa-mixer */ -enum mixer_ctl_type mixer_ctl_get_type(struct mixer_ctl *ctl) +enum mixer_ctl_type mixer_ctl_get_type(const struct mixer_ctl *ctl) { if (!ctl) return MIXER_CTL_TYPE_UNKNOWN; @@ -315,7 +315,7 @@ enum mixer_ctl_type mixer_ctl_get_type(struct mixer_ctl *ctl) * @returns On success, a string describing type of mixer control. * @ingroup libtinyalsa-mixer */ -const char *mixer_ctl_get_type_string(struct mixer_ctl *ctl) +const char *mixer_ctl_get_type_string(const struct mixer_ctl *ctl) { if (!ctl) return ""; @@ -336,7 +336,7 @@ const char *mixer_ctl_get_type_string(struct mixer_ctl *ctl) * @returns The number of values in the mixer control * @ingroup libtinyalsa-mixer */ -unsigned int mixer_ctl_get_num_values(struct mixer_ctl *ctl) +unsigned int mixer_ctl_get_num_values(const struct mixer_ctl *ctl) { if (!ctl) return 0; @@ -344,7 +344,7 @@ unsigned int mixer_ctl_get_num_values(struct mixer_ctl *ctl) return ctl->info.count; } -static int percent_to_int(struct snd_ctl_elem_info *ei, int percent) +static int percent_to_int(const struct snd_ctl_elem_info *ei, int percent) { if ((percent > 100) || (percent < 0)) { return -EINVAL; @@ -355,7 +355,7 @@ static int percent_to_int(struct snd_ctl_elem_info *ei, int percent) return ei->value.integer.min + (range * percent) / 100; } -static int int_to_percent(struct snd_ctl_elem_info *ei, int value) +static int int_to_percent(const struct snd_ctl_elem_info *ei, int value) { int range = (ei->value.integer.max - ei->value.integer.min); @@ -372,7 +372,7 @@ static int int_to_percent(struct snd_ctl_elem_info *ei, int value) * On failure, -EINVAL is returned. * @ingroup libtinyalsa-mixer */ -int mixer_ctl_get_percent(struct mixer_ctl *ctl, unsigned int id) +int mixer_ctl_get_percent(const struct mixer_ctl *ctl, unsigned int id) { if (!ctl || (ctl->info.type != SNDRV_CTL_ELEM_TYPE_INTEGER)) return -EINVAL; @@ -403,7 +403,7 @@ int mixer_ctl_set_percent(struct mixer_ctl *ctl, unsigned int id, int percent) * On failure, -EINVAL is returned. * @ingroup libtinyalsa-mixer */ -int mixer_ctl_get_value(struct mixer_ctl *ctl, unsigned int id) +int mixer_ctl_get_value(const struct mixer_ctl *ctl, unsigned int id) { struct snd_ctl_elem_value ev; int ret; @@ -449,7 +449,7 @@ int mixer_ctl_get_value(struct mixer_ctl *ctl, unsigned int id) * On failure, non-zero. * @ingroup libtinyalsa-mixer */ -int mixer_ctl_get_array(struct mixer_ctl *ctl, void *array, size_t count) +int mixer_ctl_get_array(const struct mixer_ctl *ctl, void *array, size_t count) { struct snd_ctl_elem_value ev; int ret = 0; @@ -634,7 +634,7 @@ int mixer_ctl_set_array(struct mixer_ctl *ctl, const void *array, size_t count) * On failure, -EINVAL. * @ingroup libtinyalsa-mixer */ -int mixer_ctl_get_range_min(struct mixer_ctl *ctl) +int mixer_ctl_get_range_min(const struct mixer_ctl *ctl) { if (!ctl || (ctl->info.type != SNDRV_CTL_ELEM_TYPE_INTEGER)) return -EINVAL; @@ -650,7 +650,7 @@ int mixer_ctl_get_range_min(struct mixer_ctl *ctl) * On failure, -EINVAL. * @ingroup libtinyalsa-mixer */ -int mixer_ctl_get_range_max(struct mixer_ctl *ctl) +int mixer_ctl_get_range_max(const struct mixer_ctl *ctl) { if (!ctl || (ctl->info.type != SNDRV_CTL_ELEM_TYPE_INTEGER)) return -EINVAL; @@ -663,7 +663,7 @@ int mixer_ctl_get_range_max(struct mixer_ctl *ctl) * @returns The number of enumerated items in the control. * @ingroup libtinyalsa-mixer */ -unsigned int mixer_ctl_get_num_enums(struct mixer_ctl *ctl) +unsigned int mixer_ctl_get_num_enums(const struct mixer_ctl *ctl) { if (!ctl) return 0; -- cgit v1.2.3 From a94295b6cf85fceb6b06db42b27c88131f1a18b0 Mon Sep 17 00:00:00 2001 From: Taylor Holberton Date: Thu, 1 Dec 2016 18:23:16 -0800 Subject: Added mixer_get_ctl_const This function was added to make available a mixer control accessor in a function that does not modify its value. --- src/mixer.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) (limited to 'src') diff --git a/src/mixer.c b/src/mixer.c index 5fed4a8..4bb1756 100644 --- a/src/mixer.c +++ b/src/mixer.c @@ -195,6 +195,22 @@ unsigned int mixer_get_num_ctls(const struct mixer *mixer) } /** Gets a mixer control handle, by the mixer control's id. + * For non-const access, see @ref mixer_get_ctl + * @param mixer An initialized mixer handle. + * @param id The control's id in the given mixer. + * @returns A handle to the mixer control. + * @ingroup libtinyalsa-mixer + */ +const struct mixer_ctl *mixer_get_ctl_const(const struct mixer *mixer, unsigned int id) +{ + if (mixer && (id < mixer->count)) + return mixer->ctl + id; + + return NULL; +} + +/** Gets a mixer control handle, by the mixer control's id. + * For const access, see @ref mixer_get_ctl_const * @param mixer An initialized mixer handle. * @param id The control's id in the given mixer. * @returns A handle to the mixer control. -- cgit v1.2.3 From 94c7c83c01a1d00a5e36cc77bc1b71a8ebdcd1e9 Mon Sep 17 00:00:00 2001 From: Taylor Holberton Date: Thu, 1 Dec 2016 18:35:24 -0800 Subject: Added function, mixer_get_num_ctls_by_name This function is used to get the number of mixer controls by a given name. It was added for use with mixer_get_ctl_by_name_and_index so that client code can expect the last valid index to pass. --- src/mixer.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) (limited to 'src') diff --git a/src/mixer.c b/src/mixer.c index 4bb1756..9e661c5 100644 --- a/src/mixer.c +++ b/src/mixer.c @@ -194,6 +194,30 @@ unsigned int mixer_get_num_ctls(const struct mixer *mixer) return mixer->count; } +/** Gets the number of mixer controls, that go by a specified name, for a given mixer. + * @param mixer An initialized mixer handle. + * @param name The name of the mixer control + * @returns The number of mixer controls, specified by @p name, for the given mixer. + * @ingroup libtinyalsa-mixer + */ +unsigned int mixer_get_num_ctls_by_name(const struct mixer *mixer, const char *name) +{ + unsigned int n; + unsigned int count = 0; + struct mixer_ctl *ctl; + + if (!mixer) + return 0; + + ctl = mixer->ctl; + + for (n = 0; n < mixer->count; n++) + if (!strcmp(name, (char*) ctl[n].info.id.name)) + count++; + + return count; +} + /** Gets a mixer control handle, by the mixer control's id. * For non-const access, see @ref mixer_get_ctl * @param mixer An initialized mixer handle. -- cgit v1.2.3 From 77979a8855015803c80a3bc99712ed9b72f96020 Mon Sep 17 00:00:00 2001 From: Taylor Holberton Date: Thu, 1 Dec 2016 20:04:04 -0800 Subject: Added format related getters for PCM Added functions: - pcm_get_channels - pcm_get_rate - pcm_get_format These were added since they're required for iterating samples and frames. --- src/pcm.c | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) (limited to 'src') diff --git a/src/pcm.c b/src/pcm.c index 540fd72..41f072c 100644 --- a/src/pcm.c +++ b/src/pcm.c @@ -204,6 +204,37 @@ unsigned int pcm_get_buffer_size(const struct pcm *pcm) return pcm->buffer_size; } +/** Gets the channel count of the PCM. + * @param pcm A PCM handle. + * @return The channel count of the PCM. + * @ingroup libtinyalsa-pcm + */ +unsigned int pcm_get_channels(const struct pcm *pcm) +{ + return pcm->config.channels; +} + +/** Gets the rate of the PCM. + * The rate is given in frames per second. + * @param pcm A PCM handle. + * @return The rate of the PCM. + * @ingroup libtinyalsa-pcm + */ +unsigned int pcm_get_rate(const struct pcm *pcm) +{ + return pcm->config.rate; +} + +/** Gets the format of the PCM. + * @param pcm A PCM handle. + * @return The format of the PCM. + * @ingroup libtinyalsa-pcm + */ +enum pcm_format pcm_get_format(const struct pcm *pcm) +{ + return pcm->config.format; +} + /** Gets the file descriptor of the PCM. * Useful for extending functionality of the PCM when needed. * @param pcm A PCM handle. -- cgit v1.2.3 From f9834eef249ff55ddb084b64a553ec4912d3709d Mon Sep 17 00:00:00 2001 From: Taylor Holberton Date: Thu, 1 Dec 2016 20:25:41 -0800 Subject: Added pcm_readi and pcm_writei functions Added these functions to replace pcm_read and pcm_write, which don't return the number of frames actually transferred. On GCC-like compilers, pcm_read and pcm_write have been marked as deprecated On doxygen documentation, they have been marked as deprecated as well. --- src/pcm.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 46 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/pcm.c b/src/pcm.c index 41f072c..2279137 100644 --- a/src/pcm.c +++ b/src/pcm.c @@ -523,10 +523,10 @@ int pcm_get_htimestamp(struct pcm *pcm, unsigned int *avail, * @param pcm A PCM handle. * @param data The audio sample array * @param count The number of bytes occupied by the sample array. - * @return On success, this function returns zero; otherwise, a negative number. + * @return On success, this function returns the number of frames written; otherwise, a negative number. * @ingroup libtinyalsa-pcm */ -int pcm_write(struct pcm *pcm, const void *data, unsigned int count) +int pcm_writei(struct pcm *pcm, const void *data, unsigned int count) { struct snd_xferi x; @@ -561,7 +561,7 @@ int pcm_write(struct pcm *pcm, const void *data, unsigned int count) } return oops(pcm, errno, "cannot write stream data"); } - return 0; + return x.result; } } @@ -572,10 +572,10 @@ int pcm_write(struct pcm *pcm, const void *data, unsigned int count) * @param pcm A PCM handle. * @param data The audio sample array * @param count The number of bytes occupied by the sample array. - * @return On success, this function returns zero; otherwise, a negative number. + * @return On success, this function returns the number of frames written; otherwise, a negative number. * @ingroup libtinyalsa-pcm */ -int pcm_read(struct pcm *pcm, void *data, unsigned int count) +int pcm_readi(struct pcm *pcm, void *data, unsigned int count) { struct snd_xferi x; @@ -603,8 +603,48 @@ int pcm_read(struct pcm *pcm, void *data, unsigned int count) } return oops(pcm, errno, "cannot read stream data"); } - return 0; + return x.result; + } +} + +/** Writes audio samples to PCM. + * If the PCM has not been started, it is started in this function. + * This function is only valid for PCMs opened with the @ref PCM_OUT flag. + * This function is not valid for PCMs opened with the @ref PCM_MMAP flag. + * @param pcm A PCM handle. + * @param data The audio sample array + * @param count The number of bytes occupied by the sample array. + * @return On success, this function returns zero; otherwise, a negative number. + * @deprecated + * @ingroup libtinyalsa-pcm + */ +int pcm_write(struct pcm *pcm, const void *data, unsigned int count) +{ + int ret = pcm_writei(pcm, data, count); + if (ret < 0){ + return ret; + } + return 0; +} + +/** Reads audio samples from PCM. + * If the PCM has not been started, it is started in this function. + * This function is only valid for PCMs opened with the @ref PCM_IN flag. + * This function is not valid for PCMs opened with the @ref PCM_MMAP flag. + * @param pcm A PCM handle. + * @param data The audio sample array + * @param count The number of bytes occupied by the sample array. + * @return On success, this function returns zero; otherwise, a negative number. + * @deprecated + * @ingroup libtinyalsa-pcm + */ +int pcm_read(struct pcm *pcm, void *data, unsigned int count) +{ + int ret = pcm_readi(pcm, data, count); + if (ret < 0) { + return ret; } + return 0; } static struct pcm bad_pcm = { -- cgit v1.2.3 From d7b140a5d99a7283bb78e48286bdaefaae398bba Mon Sep 17 00:00:00 2001 From: Taylor Holberton Date: Thu, 1 Dec 2016 20:43:28 -0800 Subject: Using frame counts in pcm_readi and pcm_writei pcm_readi and pcm_writei now use a frame count to specify the buffer length instead of using a byte count. --- src/pcm.c | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) (limited to 'src') diff --git a/src/pcm.c b/src/pcm.c index 2279137..c3c6a1e 100644 --- a/src/pcm.c +++ b/src/pcm.c @@ -522,11 +522,11 @@ int pcm_get_htimestamp(struct pcm *pcm, unsigned int *avail, * This function is not valid for PCMs opened with the @ref PCM_MMAP flag. * @param pcm A PCM handle. * @param data The audio sample array - * @param count The number of bytes occupied by the sample array. + * @param frame_count The number of frames occupied by the sample array. * @return On success, this function returns the number of frames written; otherwise, a negative number. * @ingroup libtinyalsa-pcm */ -int pcm_writei(struct pcm *pcm, const void *data, unsigned int count) +int pcm_writei(struct pcm *pcm, const void *data, unsigned int frame_count) { struct snd_xferi x; @@ -534,8 +534,7 @@ int pcm_writei(struct pcm *pcm, const void *data, unsigned int count) return -EINVAL; x.buf = (void*)data; - x.frames = count / (pcm->config.channels * - pcm_format_to_bits(pcm->config.format) / 8); + x.frames = frame_count; x.result = 0; for (;;) { if (!pcm->running) { @@ -571,11 +570,11 @@ int pcm_writei(struct pcm *pcm, const void *data, unsigned int count) * This function is not valid for PCMs opened with the @ref PCM_MMAP flag. * @param pcm A PCM handle. * @param data The audio sample array - * @param count The number of bytes occupied by the sample array. + * @param count The number of frames occupied by the sample array. * @return On success, this function returns the number of frames written; otherwise, a negative number. * @ingroup libtinyalsa-pcm */ -int pcm_readi(struct pcm *pcm, void *data, unsigned int count) +int pcm_readi(struct pcm *pcm, void *data, unsigned int frame_count) { struct snd_xferi x; @@ -583,8 +582,7 @@ int pcm_readi(struct pcm *pcm, void *data, unsigned int count) return -EINVAL; x.buf = data; - x.frames = count / (pcm->config.channels * - pcm_format_to_bits(pcm->config.format) / 8); + x.frames = frame_count; x.result = 0; for (;;) { if (!pcm->running) { @@ -620,7 +618,7 @@ int pcm_readi(struct pcm *pcm, void *data, unsigned int count) */ int pcm_write(struct pcm *pcm, const void *data, unsigned int count) { - int ret = pcm_writei(pcm, data, count); + int ret = pcm_writei(pcm, data, pcm_bytes_to_frames(pcm, count)); if (ret < 0){ return ret; } @@ -640,7 +638,7 @@ int pcm_write(struct pcm *pcm, const void *data, unsigned int count) */ int pcm_read(struct pcm *pcm, void *data, unsigned int count) { - int ret = pcm_readi(pcm, data, count); + int ret = pcm_readi(pcm, data, pcm_bytes_to_frames(pcm, count)); if (ret < 0) { return ret; } -- cgit v1.2.3 From d1c98e4754d4f13b01f2807a3b91eb6f7a4f58db Mon Sep 17 00:00:00 2001 From: Taylor Holberton Date: Thu, 1 Dec 2016 21:21:49 -0800 Subject: renamed parameter in doc --- src/pcm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/pcm.c b/src/pcm.c index c3c6a1e..f879fe7 100644 --- a/src/pcm.c +++ b/src/pcm.c @@ -570,7 +570,7 @@ int pcm_writei(struct pcm *pcm, const void *data, unsigned int frame_count) * This function is not valid for PCMs opened with the @ref PCM_MMAP flag. * @param pcm A PCM handle. * @param data The audio sample array - * @param count The number of frames occupied by the sample array. + * @param frame_count The number of frames occupied by the sample array. * @return On success, this function returns the number of frames written; otherwise, a negative number. * @ingroup libtinyalsa-pcm */ -- cgit v1.2.3 From 9df0309a78c85f354f96a01c2f192c6281057a05 Mon Sep 17 00:00:00 2001 From: Taylor Holberton Date: Thu, 1 Dec 2016 21:28:32 -0800 Subject: added soversion with minor and patch number --- src/Makefile | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/Makefile b/src/Makefile index da19c54..cde8267 100644 --- a/src/Makefile +++ b/src/Makefile @@ -19,7 +19,7 @@ VPATH = ../include/tinyalsa OBJECTS = mixer.o pcm.o .PHONY: all -all: libtinyalsa.a libtinyalsa.so.1 +all: libtinyalsa.a libtinyalsa.so pcm.o: pcm.c pcm.h @@ -28,19 +28,28 @@ mixer.o: mixer.c mixer.h libtinyalsa.a: $(OBJECTS) $(AR) $(ARFLAGS) $@ $^ -libtinyalsa.so.1: $(OBJECTS) - $(LD) $(LDFLAGS) -shared $^ -o $@ +libtinyalsa.so: libtinyalsa.so.1 + ln -sf $< $@ + +libtinyalsa.so.1: libtinyalsa.so.1.1.0 + ln -sf $< $@ + +libtinyalsa.so.1.1.0: $(OBJECTS) + $(LD) $(LDFLAGS) -shared -Wl,-soname,libtinyalsa.so.1 $^ -o $@ .PHONY: clean clean: rm -f libtinyalsa.a + rm -f libtinyalsa.so rm -f libtinyalsa.so.1 + rm -f libtinyalsa.so.1.1.0 rm -f $(OBJECTS) .PHONY: install install: libtinyalsa.a libtinyalsa.so.1 install -d $(DESTDIR)$(LIBDIR)/ - ln -sf libtinyalsa.so.1 $(DESTDIR)$(LIBDIR)/libtinyalsa.so install libtinyalsa.a $(DESTDIR)$(LIBDIR)/ - install libtinyalsa.so.1 $(DESTDIR)$(LIBDIR)/ + install libtinyalsa.so.1.1.0 $(DESTDIR)$(LIBDIR)/ + ln -sf libtinyalsa.so.1.1.0 $(DESTDIR)$(LIBDIR)/libtinyalsa.so.1 + ln -sf libtinyalsa.so.1 $(DESTDIR)$(LIBDIR)/libtinyalsa.so -- cgit v1.2.3