aboutsummaryrefslogtreecommitdiff
path: root/utils
diff options
context:
space:
mode:
Diffstat (limited to 'utils')
-rw-r--r--utils/tinyplay.c17
1 files changed, 10 insertions, 7 deletions
diff --git a/utils/tinyplay.c b/utils/tinyplay.c
index c006acc..f6762a0 100644
--- a/utils/tinyplay.c
+++ b/utils/tinyplay.c
@@ -389,13 +389,14 @@ 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 = pcm_frames_to_bytes(ctx->pcm, pcm_get_buffer_size(ctx->pcm));
+ size_t num_read = 0;
+ size_t remaining_data_size = ctx->chunk_header.sz;
+ size_t read_size = 0;
- size = pcm_frames_to_bytes(ctx->pcm, pcm_get_buffer_size(ctx->pcm));
- buffer = malloc(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;
}
@@ -403,15 +404,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);