Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7ecbec2a authored by Manu Gautam's avatar Manu Gautam Committed by Matt Wagantall
Browse files

usb: gadget: audio: Set default sample_rate to 16KHz



Change both playback and capture default sample rate to 16Khz
to support better audio quality.

Change-Id: If0c53321ba25730119131057d4b906dade65878f
Signed-off-by: default avatarManu Gautam <mgautam@codeaurora.org>
[jackp@codeaurora.org: updated to fit in with new function opts style]
Signed-off-by: default avatarJack Pham <jackp@codeaurora.org>
parent 90cfcc7c
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -1138,10 +1138,14 @@ static void f_audio_build_desc(struct f_audio *audio)
	rate = u_audio_get_playback_rate(card);
	sam_freq = speaker_as_type_i_desc.tSamFreq[0];
	memcpy(sam_freq, &rate, 3);
	/* Update maxP as per sample rate, bInterval assumed as 1msec */
	speaker_as_ep_out_desc.wMaxPacketSize = (rate / 1000) * 2;

	rate = u_audio_get_capture_rate(card);
	sam_freq = microphone_as_type_i_desc.tSamFreq[0];
	memcpy(sam_freq, &rate, 3);
	/* Update maxP as per sample rate, bInterval assumed as 1msec */
	microphone_as_ep_in_desc.wMaxPacketSize = (rate / 1000) * 2;

	/* Todo: Set Sample bits and other parameters */

@@ -1388,6 +1392,7 @@ UAC1_INT_ATTRIBUTE(req_capture_count);
UAC1_INT_ATTRIBUTE(audio_playback_buf_size);
UAC1_INT_ATTRIBUTE(audio_capture_buf_size);
UAC1_INT_ATTRIBUTE(audio_playback_realtime);
UAC1_INT_ATTRIBUTE(sample_rate);

#define UAC1_STR_ATTRIBUTE(name)					\
static ssize_t f_uac1_opts_##name##_show(struct f_uac1_opts *opts,	\
@@ -1445,6 +1450,7 @@ static struct configfs_attribute *f_uac1_attrs[] = {
	&f_uac1_opts_audio_playback_buf_size.attr,
	&f_uac1_opts_audio_capture_buf_size.attr,
	&f_uac1_opts_audio_playback_realtime.attr,
	&f_uac1_opts_sample_rate.attr,
	&f_uac1_opts_fn_play.attr,
	&f_uac1_opts_fn_cap.attr,
	&f_uac1_opts_fn_cntl.attr,
@@ -1493,6 +1499,7 @@ static struct usb_function_instance *f_audio_alloc_inst(void)
	opts->audio_playback_buf_size = UAC1_AUDIO_PLAYBACK_BUF_SIZE;
	opts->audio_capture_buf_size = UAC1_AUDIO_CAPTURE_BUF_SIZE;
	opts->audio_playback_realtime = 1;
	opts->sample_rate = UAC1_SAMPLE_RATE;
	opts->fn_play = FILE_PCM_PLAYBACK;
	opts->fn_cap = FILE_PCM_CAPTURE;
	opts->fn_cntl = FILE_CONTROL;
+24 −12
Original line number Diff line number Diff line
@@ -128,17 +128,20 @@ static int playback_prepare_params(struct gaudio_snd_dev *snd)
	unsigned long period_size;
	unsigned long buffer_size;
	snd_pcm_sframes_t result;
	struct gaudio *card = container_of(snd, struct gaudio, playback);
	struct f_uac1_opts *opts =
		container_of(card->func.fi, struct f_uac1_opts, func_inst);

       /*
	* SNDRV_PCM_ACCESS_RW_INTERLEAVED,
	* SNDRV_PCM_FORMAT_S16_LE
	* CHANNELS: 2
	* RATE: 8000
	* CHANNELS: 1
	* RATE: 16K default, user configurable
	*/
	snd->access = SNDRV_PCM_ACCESS_RW_INTERLEAVED;
	snd->format = SNDRV_PCM_FORMAT_S16_LE;
	snd->channels = 2;
	snd->rate = 8000;
	snd->channels = 1;
	snd->rate = opts->sample_rate;

	params = kzalloc(sizeof(*params), GFP_KERNEL);
	if (!params)
@@ -222,17 +225,20 @@ static int capture_prepare_params(struct gaudio_snd_dev *snd)
	unsigned long period_size;
	unsigned long buffer_size;
	snd_pcm_sframes_t result = 0;
	struct gaudio *card = container_of(snd, struct gaudio, capture);
	struct f_uac1_opts *opts =
		container_of(card->func.fi, struct f_uac1_opts, func_inst);

	/*
	 * SNDRV_PCM_ACCESS_RW_INTERLEAVED,
	 * SNDRV_PCM_FORMAT_S16_LE
	 * CHANNELS: 1
	 * RATE: 8000
	 * RATE: 16K default, user configurable
	 */
	snd->access = SNDRV_PCM_ACCESS_RW_INTERLEAVED;
	snd->format = SNDRV_PCM_FORMAT_S16_LE;
	snd->channels = 1;
	snd->rate = 8000;
	snd->rate = opts->sample_rate;

	params = kzalloc(sizeof(*params), GFP_KERNEL);
	if (!params) {
@@ -318,17 +324,20 @@ static int capture_prepare_params(struct gaudio_snd_dev *snd)
static int playback_default_hw_params(struct gaudio_snd_dev *snd)
{
	struct snd_pcm_hw_params *params;
	struct gaudio *card = container_of(snd, struct gaudio, playback);
	struct f_uac1_opts *opts =
		container_of(card->func.fi, struct f_uac1_opts, func_inst);

       /*
	* SNDRV_PCM_ACCESS_RW_INTERLEAVED,
	* SNDRV_PCM_FORMAT_S16_LE
	* CHANNELS: 2
	* RATE: 8000
	* CHANNELS: 1
	* RATE: 16K default, user configurable
	*/
	snd->access = SNDRV_PCM_ACCESS_RW_INTERLEAVED;
	snd->format = SNDRV_PCM_FORMAT_S16_LE;
	snd->channels = 2;
	snd->rate = 8000;
	snd->channels = 1;
	snd->rate = opts->sample_rate;

	params = kzalloc(sizeof(*params), GFP_KERNEL);
	if (!params)
@@ -362,17 +371,20 @@ static int playback_default_hw_params(struct gaudio_snd_dev *snd)
static int capture_default_hw_params(struct gaudio_snd_dev *snd)
{
	struct snd_pcm_hw_params *params;
	struct gaudio *card = container_of(snd, struct gaudio, capture);
	struct f_uac1_opts *opts =
		container_of(card->func.fi, struct f_uac1_opts, func_inst);

	/*
	 * SNDRV_PCM_ACCESS_RW_INTERLEAVED,
	 * SNDRV_PCM_FORMAT_S16_LE
	 * CHANNELS: 1
	 * RATE: 8000
	 * RATE: 16K default, user configurable
	 */
	snd->access = SNDRV_PCM_ACCESS_RW_INTERLEAVED;
	snd->format = SNDRV_PCM_FORMAT_S16_LE;
	snd->channels = 1;
	snd->rate = 8000;
	snd->rate = opts->sample_rate;

	params = kzalloc(sizeof(*params), GFP_KERNEL);
	if (!params)
+6 −4
Original line number Diff line number Diff line
@@ -27,11 +27,12 @@
#define FILE_PCM_CAPTURE	"/dev/snd/pcmC0D0c"
#define FILE_CONTROL		"/dev/snd/controlC0"

#define UAC1_IN_EP_MAX_PACKET_SIZE	16
#define UAC1_OUT_EP_MAX_PACKET_SIZE	200
#define UAC1_IN_EP_MAX_PACKET_SIZE	32
#define UAC1_OUT_EP_MAX_PACKET_SIZE	32
#define UAC1_REQ_COUNT			256
#define UAC1_AUDIO_PLAYBACK_BUF_SIZE	(64*32)
#define UAC1_AUDIO_CAPTURE_BUF_SIZE	(64*16)
#define UAC1_AUDIO_PLAYBACK_BUF_SIZE	(64 * UAC1_OUT_EP_MAX_PACKET_SIZE)
#define UAC1_AUDIO_CAPTURE_BUF_SIZE	(64 * UAC1_IN_EP_MAX_PACKET_SIZE)
#define UAC1_SAMPLE_RATE		16000

/*
 * This represents the USB side of an audio card device, managed by a USB
@@ -70,6 +71,7 @@ struct f_uac1_opts {
	int				audio_playback_buf_size;
	int				audio_capture_buf_size;
	int				audio_playback_realtime;
	int				sample_rate;
	char				*fn_play;
	char				*fn_cap;
	char				*fn_cntl;