[PATCH v9 14/16] sbc: Update sbcenc for msbc

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



---
 src/sbcenc.c |  108 +++++++++++++++++++++++++++++++++++-----------------------
 1 file changed, 65 insertions(+), 43 deletions(-)

diff --git a/src/sbcenc.c b/src/sbcenc.c
index a723b03..dabdff4 100644
--- a/src/sbcenc.c
+++ b/src/sbcenc.c
@@ -4,6 +4,7 @@
  *
  *  Copyright (C) 2008-2010  Nokia Corporation
  *  Copyright (C) 2004-2010  Marcel Holtmann <marcel@xxxxxxxxxxxx>
+ *  Copyright (C) 2012-2013  Intel Corporation
  *
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -31,6 +32,7 @@
 #include <fcntl.h>
 #include <unistd.h>
 #include <stdlib.h>
+#include <stdbool.h>
 #include <stdint.h>
 #include <string.h>
 #include <getopt.h>
@@ -45,7 +47,7 @@ static int verbose = 0;
 static unsigned char input[BUF_SIZE], output[BUF_SIZE + BUF_SIZE / 4];
 
 static void encode(char *filename, int subbands, int bitpool, int joint,
-					int dualchannel, int snr, int blocks)
+				int dualchannel, int snr, int blocks, bool msbc)
 {
 	struct au_header au_hdr;
 	sbc_t sbc;
@@ -87,57 +89,70 @@ static void encode(char *filename, int subbands, int bitpool, int joint,
 		goto done;
 	}
 
-	sbc_init(&sbc, 0L);
-
-	switch (BE_INT(au_hdr.sample_rate)) {
-	case 16000:
-		sbc.frequency = SBC_FREQ_16000;
-		break;
-	case 32000:
-		sbc.frequency = SBC_FREQ_32000;
-		break;
-	case 44100:
-		sbc.frequency = SBC_FREQ_44100;
-		break;
-	case 48000:
-		sbc.frequency = SBC_FREQ_48000;
-		break;
-	}
+	if (!msbc) {
+		sbc_init(&sbc, 0L);
+
+		switch (BE_INT(au_hdr.sample_rate)) {
+		case 16000:
+			sbc.frequency = SBC_FREQ_16000;
+			break;
+		case 32000:
+			sbc.frequency = SBC_FREQ_32000;
+			break;
+		case 44100:
+			sbc.frequency = SBC_FREQ_44100;
+			break;
+		case 48000:
+			sbc.frequency = SBC_FREQ_48000;
+			break;
+		}
+
+		srate = BE_INT(au_hdr.sample_rate);
 
-	srate = BE_INT(au_hdr.sample_rate);
+		sbc.subbands = subbands == 4 ? SBC_SB_4 : SBC_SB_8;
 
-	sbc.subbands = subbands == 4 ? SBC_SB_4 : SBC_SB_8;
+		if (BE_INT(au_hdr.channels) == 1) {
+			sbc.mode = SBC_MODE_MONO;
+			if (joint || dualchannel) {
+				fprintf(stderr, "Audio is mono but joint or "
+					"dualchannel mode has been specified\n");
+				goto done;
+			}
+		} else if (joint && !dualchannel)
+			sbc.mode = SBC_MODE_JOINT_STEREO;
+		else if (!joint && dualchannel)
+			sbc.mode = SBC_MODE_DUAL_CHANNEL;
+		else if (!joint && !dualchannel)
+			sbc.mode = SBC_MODE_STEREO;
+		else {
+			fprintf(stderr, "Both joint and dualchannel "
+						"mode have been specified\n");
+			goto done;
+		}
 
-	if (BE_INT(au_hdr.channels) == 1) {
-		sbc.mode = SBC_MODE_MONO;
-		if (joint || dualchannel) {
-			fprintf(stderr, "Audio is mono but joint or "
-				"dualchannel mode has been specified\n");
+		sbc.endian = SBC_BE;
+		sbc.bitpool = bitpool;
+		sbc.allocation = snr ? SBC_AM_SNR : SBC_AM_LOUDNESS;
+		sbc.blocks = blocks == 4 ? SBC_BLK_4 :
+				blocks == 8 ? SBC_BLK_8 :
+					blocks == 12 ? SBC_BLK_12 : SBC_BLK_16;
+	} else {
+		if (BE_INT(au_hdr.sample_rate) != 16000 ||
+				BE_INT(au_hdr.channels) != 1 ||
+				BE_INT(au_hdr.channels) != 1) {
+			fprintf(stderr, "mSBC requires 16 bits, 16kHz, mono "
+								"input\n");
 			goto done;
 		}
-	} else if (joint && !dualchannel)
-		sbc.mode = SBC_MODE_JOINT_STEREO;
-	else if (!joint && dualchannel)
-		sbc.mode = SBC_MODE_DUAL_CHANNEL;
-	else if (!joint && !dualchannel)
-		sbc.mode = SBC_MODE_STEREO;
-	else {
-		fprintf(stderr, "Both joint and dualchannel mode have been "
-								"specified\n");
-		goto done;
+
+		sbc_init_msbc(&sbc, 0);
+		sbc.endian = SBC_BE;
 	}
 
-	sbc.endian = SBC_BE;
 	/* Skip extra bytes of the header if any */
 	if (read(fd, input, BE_INT(au_hdr.hdr_size) - len) < 0)
 		goto done;
 
-	sbc.bitpool = bitpool;
-	sbc.allocation = snr ? SBC_AM_SNR : SBC_AM_LOUDNESS;
-	sbc.blocks = blocks == 4 ? SBC_BLK_4 :
-			blocks == 8 ? SBC_BLK_8 :
-				blocks == 12 ? SBC_BLK_12 : SBC_BLK_16;
-
 	if (verbose) {
 		fprintf(stderr, "encoding %s with rate %d, %d blocks, "
 			"%d subbands, %d bits, allocation method %s, "
@@ -215,6 +230,7 @@ static void usage(void)
 	printf("Options:\n"
 		"\t-h, --help           Display help\n"
 		"\t-v, --verbose        Verbose mode\n"
+		"\t-m, --msbc           mSBC codec\n"
 		"\t-s, --subbands       Number of subbands to use (4 or 8)\n"
 		"\t-b, --bitpool        Bitpool value (default is 32)\n"
 		"\t-j, --joint          Joint stereo\n"
@@ -227,6 +243,7 @@ static void usage(void)
 static struct option main_options[] = {
 	{ "help",	0, 0, 'h' },
 	{ "verbose",	0, 0, 'v' },
+	{ "msbc",	0, 0, 'm' },
 	{ "subbands",	1, 0, 's' },
 	{ "bitpool",	1, 0, 'b' },
 	{ "joint",	0, 0, 'j' },
@@ -240,8 +257,9 @@ int main(int argc, char *argv[])
 {
 	int i, opt, subbands = 8, bitpool = 32, joint = 0, dualchannel = 0;
 	int snr = 0, blocks = 16;
+	bool msbc = false;
 
-	while ((opt = getopt_long(argc, argv, "+hvs:b:jdSB:",
+	while ((opt = getopt_long(argc, argv, "+hmvs:b:jdSB:",
 						main_options, NULL)) != -1) {
 		switch(opt) {
 		case 'h':
@@ -252,6 +270,10 @@ int main(int argc, char *argv[])
 			verbose = 1;
 			break;
 
+		case 'm':
+			msbc = true;
+			break;
+
 		case 's':
 			subbands = atoi(optarg);
 			if (subbands != 8 && subbands != 4) {
@@ -302,7 +324,7 @@ int main(int argc, char *argv[])
 
 	for (i = 0; i < argc; i++)
 		encode(argv[i], subbands, bitpool, joint, dualchannel,
-								snr, blocks);
+							snr, blocks, msbc);
 
 	return 0;
 }
-- 
1.7.9.5

--
To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Bluez Devel]     [Linux Wireless Networking]     [Linux Wireless Personal Area Networking]     [Linux ATH6KL]     [Linux USB Devel]     [Linux Media Drivers]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux