aboutsummaryrefslogtreecommitdiff
path: root/utils
diff options
context:
space:
mode:
Diffstat (limited to 'utils')
-rw-r--r--utils/tinymix.c14
-rw-r--r--utils/tinyplay.c41
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);