* [PATCH 1/2] cplay: fix size and nmemb of mp3 header of fread
@ 2018-01-23 2:33 Katsuhiro Suzuki
2018-01-23 2:33 ` [PATCH 2/2] cplay: add option to specify codec ID Katsuhiro Suzuki
2018-02-01 10:53 ` [PATCH 1/2] cplay: fix size and nmemb of mp3 header of fread Vinod Koul
0 siblings, 2 replies; 4+ messages in thread
From: Katsuhiro Suzuki @ 2018-01-23 2:33 UTC (permalink / raw)
To: alsa-devel, Vinod Koul
Cc: Katsuhiro Suzuki, Jassi Brar, Takashi Iwai, Masami Hiramatsu
This patch swaps 'size' and 'nmemb' arguments of fread.
The fread returns always 1 (because 'nmemb' is 1) so checking
the return value is always failure.
Signed-off-by: Katsuhiro Suzuki <suzuki.katsuhiro@socionext.com>
---
src/utils/cplay.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/utils/cplay.c b/src/utils/cplay.c
index e0603fd..bc95f0d 100644
--- a/src/utils/cplay.c
+++ b/src/utils/cplay.c
@@ -220,7 +220,7 @@ void play_samples(char *name, unsigned int card, unsigned int device,
exit(EXIT_FAILURE);
}
- read = fread(&header, sizeof(header), 1, file);
+ read = fread(&header, 1, sizeof(header), file);
if (read != sizeof(header)) {
fprintf(stderr, "Unable to read header \n");
fclose(file);
--
2.15.0
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH 2/2] cplay: add option to specify codec ID
2018-01-23 2:33 [PATCH 1/2] cplay: fix size and nmemb of mp3 header of fread Katsuhiro Suzuki
@ 2018-01-23 2:33 ` Katsuhiro Suzuki
2018-02-01 10:52 ` Vinod Koul
2018-02-01 10:53 ` [PATCH 1/2] cplay: fix size and nmemb of mp3 header of fread Vinod Koul
1 sibling, 1 reply; 4+ messages in thread
From: Katsuhiro Suzuki @ 2018-01-23 2:33 UTC (permalink / raw)
To: alsa-devel, Vinod Koul
Cc: Katsuhiro Suzuki, Jassi Brar, Takashi Iwai, Masami Hiramatsu
This patch adds a -I command line option to set the codec ID,
same as crecord.
Signed-off-by: Katsuhiro Suzuki <suzuki.katsuhiro@socionext.com>
---
src/utils/cplay.c | 174 +++++++++++++++++++++++++++++++++++++++++++-----------
1 file changed, 139 insertions(+), 35 deletions(-)
diff --git a/src/utils/cplay.c b/src/utils/cplay.c
index bc95f0d..a716f5e 100644
--- a/src/utils/cplay.c
+++ b/src/utils/cplay.c
@@ -74,25 +74,75 @@
#include "tinycompress/tinymp3.h"
static int verbose;
+static const unsigned int DEFAULT_CODEC_ID = SND_AUDIOCODEC_PCM;
+
+static const struct {
+ const char *name;
+ unsigned int id;
+} codec_ids[] = {
+ { "PCM", SND_AUDIOCODEC_PCM },
+ { "MP3", SND_AUDIOCODEC_MP3 },
+ { "AMR", SND_AUDIOCODEC_AMR },
+ { "AMRWB", SND_AUDIOCODEC_AMRWB },
+ { "AMRWBPLUS", SND_AUDIOCODEC_AMRWBPLUS },
+ { "AAC", SND_AUDIOCODEC_AAC },
+ { "WMA", SND_AUDIOCODEC_WMA },
+ { "REAL", SND_AUDIOCODEC_REAL },
+ { "VORBIS", SND_AUDIOCODEC_VORBIS },
+ { "FLAC", SND_AUDIOCODEC_FLAC },
+ { "IEC61937", SND_AUDIOCODEC_IEC61937 },
+ { "G723_1", SND_AUDIOCODEC_G723_1 },
+ { "G729", SND_AUDIOCODEC_G729 },
+/* BESPOKE isn't defined on older kernels */
+#ifdef SND_AUDIOCODEC_BESPOKE
+ { "BESPOKE", SND_AUDIOCODEC_BESPOKE },
+#endif
+};
+#define CPLAY_NUM_CODEC_IDS (sizeof(codec_ids) / sizeof(codec_ids[0]))
+
+static const char *codec_name_from_id(unsigned int id)
+{
+ static char hexname[12];
+ int i;
+
+ for (i = 0; i < CPLAY_NUM_CODEC_IDS; ++i) {
+ if (codec_ids[i].id == id)
+ return codec_ids[i].name;
+ }
+
+ snprintf(hexname, sizeof(hexname), "0x%x", id);
+ return hexname; /* a static is safe because we're single-threaded */
+}
static void usage(void)
{
+ int i;
+
fprintf(stderr, "usage: cplay [OPTIONS] filename\n"
"-c\tcard number\n"
"-d\tdevice node\n"
+ "-I\tspecify codec ID (default is mp3)\n"
"-b\tbuffer size\n"
"-f\tfragments\n\n"
"-v\tverbose mode\n"
"-h\tPrints this help list\n\n"
"Example:\n"
"\tcplay -c 1 -d 2 test.mp3\n"
- "\tcplay -f 5 test.mp3\n");
+ "\tcplay -f 5 test.mp3\n\n"
+ "Valid codec IDs:\n");
+
+ for (i = 0; i < CPLAY_NUM_CODEC_IDS; ++i)
+ fprintf(stderr, "%s%c", codec_ids[i].name,
+ ((i + 1) % 8) ? ' ' : '\n');
+
+ fprintf(stderr, "\nor the value in decimal or hex\n");
exit(EXIT_FAILURE);
}
void play_samples(char *name, unsigned int card, unsigned int device,
- unsigned long buffer_size, unsigned int frag);
+ unsigned long buffer_size, unsigned int frag,
+ unsigned long codec_id);
struct mp3_header {
uint16_t sync;
@@ -156,15 +206,15 @@ int main(int argc, char **argv)
{
char *file;
unsigned long buffer_size = 0;
- int c;
+ int c, i;
unsigned int card = 0, device = 0, frag = 0;
-
+ unsigned int codec_id = SND_AUDIOCODEC_MP3;
if (argc < 2)
usage();
verbose = 0;
- while ((c = getopt(argc, argv, "hvb:f:c:d:")) != -1) {
+ while ((c = getopt(argc, argv, "hvb:f:c:d:I:")) != -1) {
switch (c) {
case 'h':
usage();
@@ -181,6 +231,25 @@ int main(int argc, char **argv)
case 'd':
device = strtol(optarg, NULL, 10);
break;
+ case 'I':
+ if (optarg[0] == '0') {
+ codec_id = strtol(optarg, NULL, 0);
+ } else {
+ for (i = 0; i < CPLAY_NUM_CODEC_IDS; ++i) {
+ if (strcmp(optarg,
+ codec_ids[i].name) == 0) {
+ codec_id = codec_ids[i].id;
+ break;
+ }
+ }
+
+ if (i == CPLAY_NUM_CODEC_IDS) {
+ fprintf(stderr, "Unrecognised ID: %s\n",
+ optarg);
+ usage();
+ }
+ }
+ break;
case 'v':
verbose = 1;
break;
@@ -193,24 +262,74 @@ int main(int argc, char **argv)
file = argv[optind];
- play_samples(file, card, device, buffer_size, frag);
+ play_samples(file, card, device, buffer_size, frag, codec_id);
fprintf(stderr, "Finish Playing.... Close Normally\n");
exit(EXIT_SUCCESS);
}
+void get_codec_mp3(FILE *file, struct compr_config *config,
+ struct snd_codec *codec)
+{
+ size_t read;
+ struct mp3_header header;
+ unsigned int channels, rate, bits;
+
+ read = fread(&header, sizeof(header), 1, file);
+ if (read != 1) {
+ fprintf(stderr, "Unable to read header \n");
+ fclose(file);
+ exit(EXIT_FAILURE);
+ }
+
+ if (parse_mp3_header(&header, &channels, &rate, &bits) == -1) {
+ fclose(file);
+ exit(EXIT_FAILURE);
+ }
+
+ codec->id = SND_AUDIOCODEC_MP3;
+ codec->ch_in = channels;
+ codec->ch_out = channels;
+ codec->sample_rate = rate;
+ if (!codec->sample_rate) {
+ fprintf(stderr, "invalid sample rate %d\n", rate);
+ fclose(file);
+ exit(EXIT_FAILURE);
+ }
+ codec->bit_rate = bits;
+ codec->rate_control = 0;
+ codec->profile = 0;
+ codec->level = 0;
+ codec->ch_mode = 0;
+ codec->format = 0;
+}
+
+int get_codec_iec(FILE *file, struct compr_config *config,
+ struct snd_codec *codec)
+{
+ codec->id = SND_AUDIOCODEC_IEC61937;
+ /* FIXME: cannot get accurate ch_in, any channels may be accepted */
+ codec->ch_in = 2;
+ codec->ch_out = 2;
+ codec->sample_rate = 0;
+ codec->bit_rate = 0;
+ codec->rate_control = 0;
+ codec->profile = SND_AUDIOPROFILE_IEC61937_SPDIF;
+ codec->level = 0;
+ codec->ch_mode = 0;
+ codec->format = 0;
+}
+
void play_samples(char *name, unsigned int card, unsigned int device,
- unsigned long buffer_size, unsigned int frag)
+ unsigned long buffer_size, unsigned int frag,
+ unsigned long codec_id)
{
struct compr_config config;
struct snd_codec codec;
struct compress *compress;
- struct mp3_header header;
FILE *file;
char *buffer;
int size, num_read, wrote;
- unsigned int channels, rate, bits;
- size_t read;
if (verbose)
printf("%s: entry\n", __func__);
@@ -220,33 +339,18 @@ void play_samples(char *name, unsigned int card, unsigned int device,
exit(EXIT_FAILURE);
}
- read = fread(&header, 1, sizeof(header), file);
- if (read != sizeof(header)) {
- fprintf(stderr, "Unable to read header \n");
- fclose(file);
+ switch (codec_id) {
+ case SND_AUDIOCODEC_MP3:
+ get_codec_mp3(file, &config, &codec);
+ break;
+ case SND_AUDIOCODEC_IEC61937:
+ get_codec_iec(file, &config, &codec);
+ break;
+ default:
+ fprintf(stderr, "codec ID %d is not supported\n", codec_id);
exit(EXIT_FAILURE);
}
- if (parse_mp3_header(&header, &channels, &rate, &bits) == -1) {
- fclose(file);
- exit(EXIT_FAILURE);
- }
-
- codec.id = SND_AUDIOCODEC_MP3;
- codec.ch_in = channels;
- codec.ch_out = channels;
- codec.sample_rate = rate;
- if (!codec.sample_rate) {
- fprintf(stderr, "invalid sample rate %d\n", rate);
- fclose(file);
- exit(EXIT_FAILURE);
- }
- codec.bit_rate = bits;
- codec.rate_control = 0;
- codec.profile = 0;
- codec.level = 0;
- codec.ch_mode = 0;
- codec.format = 0;
if ((buffer_size != 0) && (frag != 0)) {
config.fragment_size = buffer_size/frag;
config.fragments = frag;
@@ -292,7 +396,7 @@ void play_samples(char *name, unsigned int card, unsigned int device,
printf("Playing file %s On Card %u device %u, with buffer of %lu bytes\n",
name, card, device, buffer_size);
printf("Format %u Channels %u, %u Hz, Bit Rate %d\n",
- SND_AUDIOCODEC_MP3, channels, rate, bits);
+ codec.id, codec.ch_in, codec.sample_rate, codec.bit_rate);
compress_start(compress);
if (verbose)
--
2.15.0
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH 2/2] cplay: add option to specify codec ID
2018-01-23 2:33 ` [PATCH 2/2] cplay: add option to specify codec ID Katsuhiro Suzuki
@ 2018-02-01 10:52 ` Vinod Koul
0 siblings, 0 replies; 4+ messages in thread
From: Vinod Koul @ 2018-02-01 10:52 UTC (permalink / raw)
To: Katsuhiro Suzuki; +Cc: Jassi Brar, alsa-devel, Takashi Iwai, Masami Hiramatsu
On Tue, Jan 23, 2018 at 11:33:12AM +0900, Katsuhiro Suzuki wrote:
> This patch adds a -I command line option to set the codec ID,
> same as crecord.
But then you are adding iec support too and moving mp3 support around to fir
better, so that part can be separate patches. Otherwise change lgtm
>
> Signed-off-by: Katsuhiro Suzuki <suzuki.katsuhiro@socionext.com>
> ---
> src/utils/cplay.c | 174 +++++++++++++++++++++++++++++++++++++++++++-----------
> 1 file changed, 139 insertions(+), 35 deletions(-)
>
> diff --git a/src/utils/cplay.c b/src/utils/cplay.c
> index bc95f0d..a716f5e 100644
> --- a/src/utils/cplay.c
> +++ b/src/utils/cplay.c
> @@ -74,25 +74,75 @@
> #include "tinycompress/tinymp3.h"
>
> static int verbose;
> +static const unsigned int DEFAULT_CODEC_ID = SND_AUDIOCODEC_PCM;
> +
> +static const struct {
> + const char *name;
> + unsigned int id;
> +} codec_ids[] = {
> + { "PCM", SND_AUDIOCODEC_PCM },
> + { "MP3", SND_AUDIOCODEC_MP3 },
> + { "AMR", SND_AUDIOCODEC_AMR },
> + { "AMRWB", SND_AUDIOCODEC_AMRWB },
> + { "AMRWBPLUS", SND_AUDIOCODEC_AMRWBPLUS },
> + { "AAC", SND_AUDIOCODEC_AAC },
> + { "WMA", SND_AUDIOCODEC_WMA },
> + { "REAL", SND_AUDIOCODEC_REAL },
> + { "VORBIS", SND_AUDIOCODEC_VORBIS },
> + { "FLAC", SND_AUDIOCODEC_FLAC },
> + { "IEC61937", SND_AUDIOCODEC_IEC61937 },
> + { "G723_1", SND_AUDIOCODEC_G723_1 },
> + { "G729", SND_AUDIOCODEC_G729 },
> +/* BESPOKE isn't defined on older kernels */
> +#ifdef SND_AUDIOCODEC_BESPOKE
> + { "BESPOKE", SND_AUDIOCODEC_BESPOKE },
> +#endif
> +};
> +#define CPLAY_NUM_CODEC_IDS (sizeof(codec_ids) / sizeof(codec_ids[0]))
> +
> +static const char *codec_name_from_id(unsigned int id)
> +{
> + static char hexname[12];
> + int i;
> +
> + for (i = 0; i < CPLAY_NUM_CODEC_IDS; ++i) {
> + if (codec_ids[i].id == id)
> + return codec_ids[i].name;
> + }
> +
> + snprintf(hexname, sizeof(hexname), "0x%x", id);
> + return hexname; /* a static is safe because we're single-threaded */
> +}
>
> static void usage(void)
> {
> + int i;
> +
> fprintf(stderr, "usage: cplay [OPTIONS] filename\n"
> "-c\tcard number\n"
> "-d\tdevice node\n"
> + "-I\tspecify codec ID (default is mp3)\n"
> "-b\tbuffer size\n"
> "-f\tfragments\n\n"
> "-v\tverbose mode\n"
> "-h\tPrints this help list\n\n"
> "Example:\n"
> "\tcplay -c 1 -d 2 test.mp3\n"
> - "\tcplay -f 5 test.mp3\n");
> + "\tcplay -f 5 test.mp3\n\n"
> + "Valid codec IDs:\n");
> +
> + for (i = 0; i < CPLAY_NUM_CODEC_IDS; ++i)
> + fprintf(stderr, "%s%c", codec_ids[i].name,
> + ((i + 1) % 8) ? ' ' : '\n');
> +
> + fprintf(stderr, "\nor the value in decimal or hex\n");
>
> exit(EXIT_FAILURE);
> }
>
> void play_samples(char *name, unsigned int card, unsigned int device,
> - unsigned long buffer_size, unsigned int frag);
> + unsigned long buffer_size, unsigned int frag,
> + unsigned long codec_id);
>
> struct mp3_header {
> uint16_t sync;
> @@ -156,15 +206,15 @@ int main(int argc, char **argv)
> {
> char *file;
> unsigned long buffer_size = 0;
> - int c;
> + int c, i;
> unsigned int card = 0, device = 0, frag = 0;
> -
> + unsigned int codec_id = SND_AUDIOCODEC_MP3;
>
> if (argc < 2)
> usage();
>
> verbose = 0;
> - while ((c = getopt(argc, argv, "hvb:f:c:d:")) != -1) {
> + while ((c = getopt(argc, argv, "hvb:f:c:d:I:")) != -1) {
> switch (c) {
> case 'h':
> usage();
> @@ -181,6 +231,25 @@ int main(int argc, char **argv)
> case 'd':
> device = strtol(optarg, NULL, 10);
> break;
> + case 'I':
> + if (optarg[0] == '0') {
> + codec_id = strtol(optarg, NULL, 0);
> + } else {
> + for (i = 0; i < CPLAY_NUM_CODEC_IDS; ++i) {
> + if (strcmp(optarg,
> + codec_ids[i].name) == 0) {
> + codec_id = codec_ids[i].id;
> + break;
> + }
> + }
> +
> + if (i == CPLAY_NUM_CODEC_IDS) {
> + fprintf(stderr, "Unrecognised ID: %s\n",
> + optarg);
> + usage();
> + }
> + }
> + break;
> case 'v':
> verbose = 1;
> break;
> @@ -193,24 +262,74 @@ int main(int argc, char **argv)
>
> file = argv[optind];
>
> - play_samples(file, card, device, buffer_size, frag);
> + play_samples(file, card, device, buffer_size, frag, codec_id);
>
> fprintf(stderr, "Finish Playing.... Close Normally\n");
> exit(EXIT_SUCCESS);
> }
>
> +void get_codec_mp3(FILE *file, struct compr_config *config,
> + struct snd_codec *codec)
> +{
> + size_t read;
> + struct mp3_header header;
> + unsigned int channels, rate, bits;
> +
> + read = fread(&header, sizeof(header), 1, file);
> + if (read != 1) {
> + fprintf(stderr, "Unable to read header \n");
> + fclose(file);
> + exit(EXIT_FAILURE);
> + }
> +
> + if (parse_mp3_header(&header, &channels, &rate, &bits) == -1) {
> + fclose(file);
> + exit(EXIT_FAILURE);
> + }
> +
> + codec->id = SND_AUDIOCODEC_MP3;
> + codec->ch_in = channels;
> + codec->ch_out = channels;
> + codec->sample_rate = rate;
> + if (!codec->sample_rate) {
> + fprintf(stderr, "invalid sample rate %d\n", rate);
> + fclose(file);
> + exit(EXIT_FAILURE);
> + }
> + codec->bit_rate = bits;
> + codec->rate_control = 0;
> + codec->profile = 0;
> + codec->level = 0;
> + codec->ch_mode = 0;
> + codec->format = 0;
> +}
> +
> +int get_codec_iec(FILE *file, struct compr_config *config,
> + struct snd_codec *codec)
> +{
> + codec->id = SND_AUDIOCODEC_IEC61937;
> + /* FIXME: cannot get accurate ch_in, any channels may be accepted */
> + codec->ch_in = 2;
> + codec->ch_out = 2;
> + codec->sample_rate = 0;
> + codec->bit_rate = 0;
> + codec->rate_control = 0;
> + codec->profile = SND_AUDIOPROFILE_IEC61937_SPDIF;
> + codec->level = 0;
> + codec->ch_mode = 0;
> + codec->format = 0;
> +}
> +
> void play_samples(char *name, unsigned int card, unsigned int device,
> - unsigned long buffer_size, unsigned int frag)
> + unsigned long buffer_size, unsigned int frag,
> + unsigned long codec_id)
> {
> struct compr_config config;
> struct snd_codec codec;
> struct compress *compress;
> - struct mp3_header header;
> FILE *file;
> char *buffer;
> int size, num_read, wrote;
> - unsigned int channels, rate, bits;
> - size_t read;
>
> if (verbose)
> printf("%s: entry\n", __func__);
> @@ -220,33 +339,18 @@ void play_samples(char *name, unsigned int card, unsigned int device,
> exit(EXIT_FAILURE);
> }
>
> - read = fread(&header, 1, sizeof(header), file);
> - if (read != sizeof(header)) {
> - fprintf(stderr, "Unable to read header \n");
> - fclose(file);
> + switch (codec_id) {
> + case SND_AUDIOCODEC_MP3:
> + get_codec_mp3(file, &config, &codec);
> + break;
> + case SND_AUDIOCODEC_IEC61937:
> + get_codec_iec(file, &config, &codec);
> + break;
> + default:
> + fprintf(stderr, "codec ID %d is not supported\n", codec_id);
> exit(EXIT_FAILURE);
> }
>
> - if (parse_mp3_header(&header, &channels, &rate, &bits) == -1) {
> - fclose(file);
> - exit(EXIT_FAILURE);
> - }
> -
> - codec.id = SND_AUDIOCODEC_MP3;
> - codec.ch_in = channels;
> - codec.ch_out = channels;
> - codec.sample_rate = rate;
> - if (!codec.sample_rate) {
> - fprintf(stderr, "invalid sample rate %d\n", rate);
> - fclose(file);
> - exit(EXIT_FAILURE);
> - }
> - codec.bit_rate = bits;
> - codec.rate_control = 0;
> - codec.profile = 0;
> - codec.level = 0;
> - codec.ch_mode = 0;
> - codec.format = 0;
> if ((buffer_size != 0) && (frag != 0)) {
> config.fragment_size = buffer_size/frag;
> config.fragments = frag;
> @@ -292,7 +396,7 @@ void play_samples(char *name, unsigned int card, unsigned int device,
> printf("Playing file %s On Card %u device %u, with buffer of %lu bytes\n",
> name, card, device, buffer_size);
> printf("Format %u Channels %u, %u Hz, Bit Rate %d\n",
> - SND_AUDIOCODEC_MP3, channels, rate, bits);
> + codec.id, codec.ch_in, codec.sample_rate, codec.bit_rate);
>
> compress_start(compress);
> if (verbose)
> --
> 2.15.0
>
--
~Vinod
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH 1/2] cplay: fix size and nmemb of mp3 header of fread
2018-01-23 2:33 [PATCH 1/2] cplay: fix size and nmemb of mp3 header of fread Katsuhiro Suzuki
2018-01-23 2:33 ` [PATCH 2/2] cplay: add option to specify codec ID Katsuhiro Suzuki
@ 2018-02-01 10:53 ` Vinod Koul
1 sibling, 0 replies; 4+ messages in thread
From: Vinod Koul @ 2018-02-01 10:53 UTC (permalink / raw)
To: Katsuhiro Suzuki; +Cc: Jassi Brar, alsa-devel, Takashi Iwai, Masami Hiramatsu
On Tue, Jan 23, 2018 at 11:33:11AM +0900, Katsuhiro Suzuki wrote:
> This patch swaps 'size' and 'nmemb' arguments of fread.
> The fread returns always 1 (because 'nmemb' is 1) so checking
> the return value is always failure.
Applied, thanks
--
~Vinod
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2018-02-01 10:48 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-01-23 2:33 [PATCH 1/2] cplay: fix size and nmemb of mp3 header of fread Katsuhiro Suzuki
2018-01-23 2:33 ` [PATCH 2/2] cplay: add option to specify codec ID Katsuhiro Suzuki
2018-02-01 10:52 ` Vinod Koul
2018-02-01 10:53 ` [PATCH 1/2] cplay: fix size and nmemb of mp3 header of fread Vinod Koul
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.