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

Commit f1c7d369 authored by Tarun Gupta's avatar Tarun Gupta Committed by Gerrit - the friendly Code Review server
Browse files

usb: gadget: audio: Prevent opening playback and capture stream twice



Voice over USB mode, playback and capture streams are opened twice from
two threads at the same time, when playback and capture devices are
selected together in host PC. This would cause memory map failure with AFE.
Fix this by splitting the gaudio_open_streams() function into
gaudio_open_playback_streams() and gaudio_open_capture_streams().

CRs-Fixed: 883629
Change-Id: I388b13558c3445c3d7e4694b9e4ed6fdd33596a1
Signed-off-by: default avatarHemant Kumar <hemantk@codeaurora.org>
Signed-off-by: default avatarTarun Gupta <tarung@codeaurora.org>
parent 50e0173f
Loading
Loading
Loading
Loading
+24 −8
Original line number Diff line number Diff line
@@ -415,7 +415,7 @@ static int capture_default_hw_params(struct gaudio_snd_dev *snd)
	return 0;
}

static int gaudio_open_streams(struct gaudio *the_card)
static int gaudio_open_playback_streams(struct gaudio *the_card)
{
	struct gaudio_snd_dev *snd;
	int res = 0;
@@ -437,6 +437,21 @@ static int gaudio_open_streams(struct gaudio *the_card)

	pr_debug("Initialized playback params");

	return 0;
}

static int gaudio_open_capture_streams(struct gaudio *the_card)
{
	struct gaudio_snd_dev *snd;
	int res = 0;

	if (!the_card) {
		pr_err("%s: Card is NULL", __func__);
		return -ENODEV;
	}

	pr_debug("Initialize hw params");

	/* Open PCM capture device and setup substream */
	snd = &the_card->capture;
	res = capture_prepare_params(snd);
@@ -452,7 +467,8 @@ static int gaudio_open_streams(struct gaudio *the_card)

void u_audio_clear(struct gaudio *card)
{
	card->audio_reinit = false;
	card->audio_reinit_playback = false;
	card->audio_reinit_capture = false;
}

/**
@@ -473,13 +489,13 @@ size_t u_audio_playback(struct gaudio *card, void *buf, size_t count)
		return 0;
	}

	if (!card->audio_reinit) {
		err = gaudio_open_streams(card);
	if (!card->audio_reinit_playback) {
		err = gaudio_open_playback_streams(card);
		if (err) {
			pr_err("Failed to init audio streams");
			return 0;
		}
		card->audio_reinit = 1;
		card->audio_reinit_playback = 1;
	}

try_again:
@@ -530,13 +546,13 @@ size_t u_audio_capture(struct gaudio *card, void *buf, size_t count)
	struct snd_pcm_substream *substream = snd->substream;
	struct snd_pcm_runtime   *runtime = substream->runtime;

	if (!card->audio_reinit) {
		err = gaudio_open_streams(card);
	if (!card->audio_reinit_capture) {
		err = gaudio_open_capture_streams(card);
		if (err) {
			pr_err("Failed to init audio streams: err %d", err);
			return 0;
		}
		card->audio_reinit = 1;
		card->audio_reinit_capture = 1;
	}

try_again:
+2 −1
Original line number Diff line number Diff line
@@ -59,7 +59,8 @@ struct gaudio {
	struct gaudio_snd_dev		playback;
	struct gaudio_snd_dev		capture;

	bool				audio_reinit;
	bool				audio_reinit_capture;
	bool				audio_reinit_playback;
	/* TODO */
};