Alsa-Devel Archive on lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/2] crecord: Fix some minor coding style problems
@ 2017-01-18 16:29 Richard Fitzgerald
  2017-01-18 16:29 ` [PATCH 2/2] crecord: Add option to specify codec ID Richard Fitzgerald
  2017-01-18 16:52 ` [PATCH 1/2] crecord: Fix some minor coding style problems Vinod Koul
  0 siblings, 2 replies; 3+ messages in thread
From: Richard Fitzgerald @ 2017-01-18 16:29 UTC (permalink / raw)
  To: vinod.koul; +Cc: alsa-devel, patches

- Incorrect indenting of arguments to capture_samples()
- Wrap long line in capture_samples()
- Added a blank line in main() for readability
- Deleted extra trailing blank line at end of file

Signed-off-by: Richard Fitzgerald <rf@opensource.wolfsonmicro.com>
---
 src/utils/crecord.c | 11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)

diff --git a/src/utils/crecord.c b/src/utils/crecord.c
index 1ba54d7..390fe45 100644
--- a/src/utils/crecord.c
+++ b/src/utils/crecord.c
@@ -237,9 +237,9 @@ static int finish_record(void)
 }
 
 static void capture_samples(char *name, unsigned int card, unsigned int device,
-		     unsigned long buffer_size, unsigned int frag,
-		     unsigned int length, unsigned int rate,
-		     unsigned int channels, unsigned int format)
+			    unsigned long buffer_size, unsigned int frag,
+			    unsigned int length, unsigned int rate,
+			    unsigned int channels, unsigned int format)
 {
 	struct compr_config config;
 	struct snd_codec codec;
@@ -268,7 +268,8 @@ static void capture_samples(char *name, unsigned int card, unsigned int device,
         if (!name) {
                 file = STDOUT_FILENO;
         } else {
-	        file = open(name, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP);
+	        file = open(name, O_RDWR | O_CREAT,
+			    S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP);
 	        if (file == -1) {
 		       fprintf(stderr, "Unable to open file '%s'\n", name);
 		       exit(EXIT_FAILURE);
@@ -466,6 +467,7 @@ int main(int argc, char **argv)
 			exit(EXIT_FAILURE);
 		}
 	}
+
 	if (optind >= argc) {
 		file = NULL;
 		finfo = fopen("/dev/null", "w");
@@ -483,4 +485,3 @@ int main(int argc, char **argv)
 
 	exit(EXIT_SUCCESS);
 }
-
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 3+ messages in thread

* [PATCH 2/2] crecord: Add option to specify codec ID
  2017-01-18 16:29 [PATCH 1/2] crecord: Fix some minor coding style problems Richard Fitzgerald
@ 2017-01-18 16:29 ` Richard Fitzgerald
  2017-01-18 16:52 ` [PATCH 1/2] crecord: Fix some minor coding style problems Vinod Koul
  1 sibling, 0 replies; 3+ messages in thread
From: Richard Fitzgerald @ 2017-01-18 16:29 UTC (permalink / raw)
  To: vinod.koul; +Cc: alsa-devel, patches

This patch adds a -I command line option to set the codec ID,
either from a defined set of string values or as a number.

After discussion with Vinod it was agreed that we should only
allow writing to a file if we support creating the correct container
file format for that data. As we currently only have support for
creating WAV files only PCM data can be written to a file. Other
formats can be sent raw to stdout.

Signed-off-by: Richard Fitzgerald <rf@opensource.wolfsonmicro.com>
---
 src/utils/crecord.c | 99 ++++++++++++++++++++++++++++++++++++++++++++++-------
 1 file changed, 87 insertions(+), 12 deletions(-)

diff --git a/src/utils/crecord.c b/src/utils/crecord.c
index 390fe45..1fd3698 100644
--- a/src/utils/crecord.c
+++ b/src/utils/crecord.c
@@ -83,6 +83,31 @@ static bool streamed;
 static const unsigned int DEFAULT_CHANNELS = 1;
 static const unsigned int DEFAULT_RATE = 44100;
 static const unsigned int DEFAULT_FORMAT = SNDRV_PCM_FORMAT_S16_LE;
+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 CREC_NUM_CODEC_IDS (sizeof(codec_ids) / sizeof(codec_ids[0]))
 
 struct riff_chunk {
 	char desc[4];
@@ -151,9 +176,25 @@ static void size_wave_header(struct wave_header *header, uint32_t size)
 	header->data.chunk.size = size;
 }
 
+static const char *codec_name_from_id(unsigned int id)
+{
+	static char hexname[12];
+	int i;
+
+	for (i = 0; i < CREC_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)
 {
-	fprintf(stderr, "usage: crecord [OPTIONS] [filename]\n"
+	int i;
+
+	fprintf(stderr, "usage: crecord [OPTIONS] [filename.wav]\n"
 		"-c\tcard number\n"
 		"-d\tdevice node\n"
 		"-b\tbuffer size\n"
@@ -163,13 +204,23 @@ static void usage(void)
 		"-h\tPrints this help list\n\n"
 		"-C\tSpecify the number of channels (default %u)\n"
 		"-R\tSpecify the sample rate (default %u)\n"
-		"-F\tSpecify the format: S16_LE, S32_LE (default S16_LE)\n\n"
-		"If filename is not given the output is\n"
-		"written to stdout\n\n"
+		"-F\tSpecify the format: S16_LE, S32_LE (default S16_LE)\n"
+		"-I\tSpecify codec ID (default %s)\n\n"
+		"If filename.wav is not given the output is written to stdout\n"
+		"Only PCM data can be written to a WAV file.\n\n"
 		"Example:\n"
 		"\tcrecord -c 1 -d 2 test.wav\n"
-		"\tcrecord -f 5 test.wav\n",
-		DEFAULT_CHANNELS, DEFAULT_RATE);
+		"\tcrecord -f 5 test.wav\n"
+		"\tcrecord -I BESPOKE >raw.bin\n\n"
+		"Valid codec IDs:\n",
+		DEFAULT_CHANNELS, DEFAULT_RATE,
+		codec_name_from_id(DEFAULT_CODEC_ID));
+
+	for (i = 0; i < CREC_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);
 }
@@ -239,7 +290,8 @@ static int finish_record(void)
 static void capture_samples(char *name, unsigned int card, unsigned int device,
 			    unsigned long buffer_size, unsigned int frag,
 			    unsigned int length, unsigned int rate,
-			    unsigned int channels, unsigned int format)
+			    unsigned int channels, unsigned int format,
+			    unsigned int codec_id)
 {
 	struct compr_config config;
 	struct snd_codec codec;
@@ -289,7 +341,7 @@ static void capture_samples(char *name, unsigned int card, unsigned int device,
 
 	memset(&codec, 0, sizeof(codec));
 	memset(&config, 0, sizeof(config));
-	codec.id = SND_AUDIOCODEC_PCM;
+	codec.id = codec_id;
 	codec.ch_in = channels;
 	codec.ch_out = channels;
 	codec.sample_rate = rate;
@@ -409,10 +461,11 @@ 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, length = 0;
 	unsigned int rate = DEFAULT_RATE, channels = DEFAULT_CHANNELS;
 	unsigned int format = DEFAULT_FORMAT;
+	unsigned int codec_id = DEFAULT_CODEC_ID;
 
 	if (signal(SIGINT, sig_handler) == SIG_ERR) {
 		fprintf(stderr, "Error registering signal handler\n");
@@ -423,7 +476,7 @@ int main(int argc, char **argv)
 		usage();
 
 	verbose = 0;
-	while ((c = getopt(argc, argv, "hvl:R:C:F:b:f:c:d:")) != -1) {
+	while ((c = getopt(argc, argv, "hvl:R:C:F:I:b:f:c:d:")) != -1) {
 		switch (c) {
 		case 'h':
 			usage();
@@ -463,6 +516,25 @@ int main(int argc, char **argv)
 				usage();
 			}
 			break;
+		case 'I':
+			if (optarg[0] == '0') {
+				codec_id = strtol(optarg, NULL, 0);
+			} else {
+				for (i = 0; i < CREC_NUM_CODEC_IDS; ++i) {
+					if (strcmp(optarg,
+						   codec_ids[i].name) == 0) {
+						codec_id = codec_ids[i].id;
+						break;
+					}
+				}
+
+				if (i == CREC_NUM_CODEC_IDS) {
+					fprintf(stderr, "Unrecognised ID: %s\n",
+						optarg);
+					usage();
+				}
+			}
+			break;
 		default:
 			exit(EXIT_FAILURE);
 		}
@@ -472,14 +544,17 @@ int main(int argc, char **argv)
 		file = NULL;
 		finfo = fopen("/dev/null", "w");
 		streamed = true;
-	} else {
+	} else if (codec_id == SND_AUDIOCODEC_PCM) {
 		file = argv[optind];
 		finfo = stdout;
 		streamed = false;
+	} else {
+		fprintf(stderr, "ERROR: Only PCM can be written to a WAV file\n");
+		exit(EXIT_FAILURE);
 	}
 
 	capture_samples(file, card, device, buffer_size, frag, length,
-			rate, channels, format);
+			rate, channels, format, codec_id);
 
 	fprintf(finfo, "Finish capturing... Close Normally\n");
 
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH 1/2] crecord: Fix some minor coding style problems
  2017-01-18 16:29 [PATCH 1/2] crecord: Fix some minor coding style problems Richard Fitzgerald
  2017-01-18 16:29 ` [PATCH 2/2] crecord: Add option to specify codec ID Richard Fitzgerald
@ 2017-01-18 16:52 ` Vinod Koul
  1 sibling, 0 replies; 3+ messages in thread
From: Vinod Koul @ 2017-01-18 16:52 UTC (permalink / raw)
  To: Richard Fitzgerald; +Cc: alsa-devel, patches

On Wed, Jan 18, 2017 at 04:29:53PM +0000, Richard Fitzgerald wrote:
> - Incorrect indenting of arguments to capture_samples()
> - Wrap long line in capture_samples()
> - Added a blank line in main() for readability
> - Deleted extra trailing blank line at end of file

Applied both, thanks

-- 
~Vinod

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2017-01-18 16:52 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-01-18 16:29 [PATCH 1/2] crecord: Fix some minor coding style problems Richard Fitzgerald
2017-01-18 16:29 ` [PATCH 2/2] crecord: Add option to specify codec ID Richard Fitzgerald
2017-01-18 16:52 ` [PATCH 1/2] crecord: Fix some minor coding style problems Vinod Koul

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox