diff options
Diffstat (limited to 'utils')
-rw-r--r-- | utils/tinymix.c | 14 | ||||
-rw-r--r-- | utils/tinyplay.c | 41 |
2 files changed, 41 insertions, 14 deletions
diff --git a/utils/tinymix.c b/utils/tinymix.c index fdb774c..41ca269 100644 --- a/utils/tinymix.c +++ b/utils/tinymix.c @@ -146,6 +146,16 @@ int main(int argc, char **argv) return EXIT_SUCCESS; } +static int isnumber(const char *str) { + char *end; + + if (str == NULL || strlen(str) == 0) + return 0; + + strtol(str, &end, 0); + return strlen(end) == 0; +} + static void tinymix_list_controls(struct mixer *mixer, int print_all) { struct mixer_ctl *ctl; @@ -201,7 +211,7 @@ static void tinymix_detail_control(struct mixer *mixer, const char *control) int ret; char *buf = NULL; - if (isdigit(control[0])) + if (isnumber(control)) ctl = mixer_get_ctl(mixer, atoi(control)); else ctl = mixer_get_ctl_by_name(mixer, control); @@ -469,7 +479,7 @@ static int tinymix_set_value(struct mixer *mixer, const char *control, struct mixer_ctl *ctl; enum mixer_ctl_type type; - if (isdigit(control[0])) + if (isnumber(control)) ctl = mixer_get_ctl(mixer, atoi(control)); else ctl = mixer_get_ctl_by_name(mixer, control); diff --git a/utils/tinyplay.c b/utils/tinyplay.c index 20dd7e8..2689158 100644 --- a/utils/tinyplay.c +++ b/utils/tinyplay.c @@ -58,9 +58,10 @@ void cmd_init(struct cmd *cmd) cmd->config.channels = 2; cmd->config.rate = 48000; cmd->config.format = PCM_FORMAT_S16_LE; - cmd->config.silence_threshold = 1024 * 2; - cmd->config.stop_threshold = 1024 * 2; - cmd->config.start_threshold = 1024; + cmd->config.silence_threshold = cmd->config.period_size * cmd->config.period_count; + cmd->config.silence_size = 0; + cmd->config.stop_threshold = cmd->config.period_size * cmd->config.period_count; + cmd->config.start_threshold = cmd->config.period_size; cmd->bits = 16; } @@ -317,6 +318,10 @@ int main(int argc, char **argv) cmd.filetype++; } + cmd.config.silence_threshold = cmd.config.period_size * cmd.config.period_count; + cmd.config.stop_threshold = cmd.config.period_size * cmd.config.period_count; + cmd.config.start_threshold = cmd.config.period_size; + if (ctx_init(&ctx, &cmd) < 0) { return EXIT_FAILURE; } @@ -375,8 +380,10 @@ int sample_is_playable(const struct cmd *cmd) can_play = check_param(params, PCM_PARAM_RATE, cmd->config.rate, "sample rate", "hz"); can_play &= check_param(params, PCM_PARAM_CHANNELS, cmd->config.channels, "sample", " channels"); can_play &= check_param(params, PCM_PARAM_SAMPLE_BITS, cmd->bits, "bits", " bits"); - can_play &= check_param(params, PCM_PARAM_PERIOD_SIZE, cmd->config.period_size, "period size", ""); - can_play &= check_param(params, PCM_PARAM_PERIODS, cmd->config.period_count, "period count", ""); + can_play &= check_param(params, PCM_PARAM_PERIOD_SIZE, cmd->config.period_size, "period size", + " frames"); + can_play &= check_param(params, PCM_PARAM_PERIODS, cmd->config.period_count, "period count", + " frames"); pcm_params_free(params); @@ -386,13 +393,21 @@ int sample_is_playable(const struct cmd *cmd) int play_sample(struct ctx *ctx) { char *buffer; - int size; - int num_read; + size_t buffer_size = 0; + size_t num_read = 0; + size_t remaining_data_size = ctx->chunk_header.sz; + size_t read_size = 0; + const struct pcm_config *config = pcm_get_config(ctx->pcm); + + if (config == NULL) { + fprintf(stderr, "unable to get pcm config\n"); + return -1; + } - size = pcm_frames_to_bytes(ctx->pcm, pcm_get_buffer_size(ctx->pcm)); - buffer = malloc(size); + buffer_size = pcm_frames_to_bytes(ctx->pcm, config->period_size); + buffer = malloc(buffer_size); if (!buffer) { - fprintf(stderr, "unable to allocate %d bytes\n", size); + fprintf(stderr, "unable to allocate %zu bytes\n", buffer_size); return -1; } @@ -400,15 +415,17 @@ int play_sample(struct ctx *ctx) signal(SIGINT, stream_close); do { - num_read = fread(buffer, 1, size, ctx->file); + read_size = remaining_data_size > buffer_size ? buffer_size : remaining_data_size; + num_read = fread(buffer, 1, read_size, ctx->file); if (num_read > 0) { if (pcm_writei(ctx->pcm, buffer, pcm_bytes_to_frames(ctx->pcm, num_read)) < 0) { fprintf(stderr, "error playing sample\n"); break; } + remaining_data_size -= num_read; } - } while (!close && num_read > 0); + } while (!close && num_read > 0 && remaining_data_size > 0); pcm_wait(ctx->pcm, -1); |