From 6f778c21ee357a662cdd758cff578a3e4b85eedf Mon Sep 17 00:00:00 2001 From: Zhang Peng Date: Tue, 4 Aug 2020 15:29:29 +0800 Subject: [PATCH] cplay: Add pause feature Add option: -p pause Upstream-Status: Inappropriate [i.MX specific] Signed-off-by: Zhang Peng --- src/utils/cplay.c | 56 +++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 52 insertions(+), 4 deletions(-) diff --git a/src/utils/cplay.c b/src/utils/cplay.c index 8882f4d..8e3dcbb 100644 --- a/src/utils/cplay.c +++ b/src/utils/cplay.c @@ -117,6 +117,9 @@ static void usage(void) "-f\tfragments\n\n" "-v\tverbose mode\n" "-h\tPrints this help list\n\n" + "-p\tpause\n" + "-m\tpause blocks\n" + "-n\tpause time duration\n" "Example:\n" "\tcplay -c 1 -d 2 test.mp3\n" "\tcplay -f 5 test.mp3\n\n" @@ -133,7 +136,8 @@ static void usage(void) void play_samples(char *name, unsigned int card, unsigned int device, unsigned long buffer_size, unsigned int frag, - unsigned long codec_id); + unsigned long codec_id, int pause_count, int pause_block, + int pause_duration); struct mp3_header { uint16_t sync; @@ -262,12 +266,15 @@ int main(int argc, char **argv) int c, i; unsigned int card = 0, device = 0, frag = 0; unsigned int codec_id = SND_AUDIOCODEC_MP3; + int pause_count = 0; + int pause_block = 6; + int pause_duration = 10; if (argc < 2) usage(); verbose = 0; - while ((c = getopt(argc, argv, "hvb:f:c:d:I:")) != -1) { + while ((c = getopt(argc, argv, "hvb:f:c:d:I:p:m:n:")) != -1) { switch (c) { case 'h': usage(); @@ -306,6 +313,23 @@ int main(int argc, char **argv) case 'v': verbose = 1; break; + case 'p': + pause_count = strtol(optarg, NULL, 10); + break; + case 'm': + pause_block = strtol(optarg, NULL, 10); + if (pause_duration < 0) { + printf("Set wrong paramter! Set duration default 6.\n"); + pause_duration = 6; + } + break; + case 'n': + pause_duration = strtol(optarg, NULL, 10); + if (pause_duration < 0) { + printf("Set wrong paramter! Set duration default 10.\n"); + pause_duration = 10; + } + break; default: exit(EXIT_FAILURE); } @@ -315,7 +339,7 @@ int main(int argc, char **argv) file = argv[optind]; - play_samples(file, card, device, buffer_size, frag, codec_id); + play_samples(file, card, device, buffer_size, frag, codec_id, pause_count, pause_block, pause_duration); fprintf(stderr, "Finish Playing.... Close Normally\n"); exit(EXIT_SUCCESS); @@ -491,7 +515,8 @@ void get_codec_pcm(FILE *file, struct compr_config *config, void play_samples(char *name, unsigned int card, unsigned int device, unsigned long buffer_size, unsigned int frag, - unsigned long codec_id) + unsigned long codec_id, int pause_count, int pause_block, + int pause_duration) { struct compr_config config; struct snd_codec codec; @@ -499,6 +524,7 @@ void play_samples(char *name, unsigned int card, unsigned int device, FILE *file; char *buffer; int size, num_read, wrote; + int write_count = 0; if (verbose) printf("%s: entry\n", __func__); @@ -574,6 +600,13 @@ void play_samples(char *name, unsigned int card, unsigned int device, if (verbose) printf("%s: You should hear audio NOW!!!\n", __func__); + if (pause_count > 0) { + printf("sleep...\n"); + compress_pause(compress); + sleep(pause_duration); + compress_resume(compress); + } + do { num_read = fread(buffer, 1, size, file); if (num_read > 0) { @@ -592,8 +625,23 @@ void play_samples(char *name, unsigned int card, unsigned int device, printf("%s: wrote %d\n", __func__, wrote); } } + write_count++; + if ((pause_count > 0) && (write_count % pause_block == 0)) { + printf("pause...\n"); + compress_pause(compress); + sleep(pause_duration); + printf("pause release...\n"); + compress_resume(compress); + pause_count--; + } } while (num_read > 0); + if (pause_count > 0) { + compress_pause(compress); + sleep(5); + compress_resume(compress); + } + if (verbose) printf("%s: exit success\n", __func__); /* issue drain if it supports */ -- 2.17.1