Alsa-Devel Archive on lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/2] ALSA: emu10k1: introduce higher-level voice manipulation functions
@ 2023-05-23 10:46 Oswald Buddenhagen
  2023-05-23 10:46 ` [PATCH 2/2] ALSA: emu10k1: pass raw FX send config to snd_emu10k1_pcm_init_voice() Oswald Buddenhagen
  2023-05-23 12:14 ` [PATCH 1/2] ALSA: emu10k1: introduce higher-level voice manipulation functions Takashi Iwai
  0 siblings, 2 replies; 3+ messages in thread
From: Oswald Buddenhagen @ 2023-05-23 10:46 UTC (permalink / raw)
  To: alsa-devel; +Cc: Takashi Iwai, Jaroslav Kysela

This adds snd_emu10k1_pcm_init_{voices,extra_voice}() and
snd_emu10k1_playback_{un,}mute_voices() to slightly abstract by voice
function and potential stereo property.

Signed-off-by: Oswald Buddenhagen <oswald.buddenhagen@gmx.de>
---
 sound/pci/emu10k1/emupcm.c | 70 +++++++++++++++++++++++++++++---------
 1 file changed, 53 insertions(+), 17 deletions(-)

diff --git a/sound/pci/emu10k1/emupcm.c b/sound/pci/emu10k1/emupcm.c
index 0036593cca7c..65af94d08b47 100644
--- a/sound/pci/emu10k1/emupcm.c
+++ b/sound/pci/emu10k1/emupcm.c
@@ -312,6 +312,30 @@ static void snd_emu10k1_pcm_init_voice(struct snd_emu10k1 *emu,
 	spin_unlock_irqrestore(&emu->reg_lock, flags);
 }
 
+static void snd_emu10k1_pcm_init_voices(struct snd_emu10k1 *emu,
+					struct snd_emu10k1_voice *evoice,
+					bool w_16, bool stereo,
+					unsigned int start_addr,
+					unsigned int end_addr,
+					struct snd_emu10k1_pcm_mixer *mix)
+{
+	snd_emu10k1_pcm_init_voice(emu, 1, 0, evoice, w_16, stereo,
+				   start_addr, end_addr, mix);
+	if (stereo)
+		snd_emu10k1_pcm_init_voice(emu, 0, 0, evoice + 1, w_16, true,
+					   start_addr, end_addr, mix);
+}
+
+static void snd_emu10k1_pcm_init_extra_voice(struct snd_emu10k1 *emu,
+					     struct snd_emu10k1_voice *evoice,
+					     bool w_16,
+					     unsigned int start_addr,
+					     unsigned int end_addr)
+{
+	snd_emu10k1_pcm_init_voice(emu, 1, 1, evoice, w_16, false,
+				   start_addr, end_addr, NULL);
+}
+
 static int snd_emu10k1_playback_hw_params(struct snd_pcm_substream *substream,
 					  struct snd_pcm_hw_params *hw_params)
 {
@@ -393,18 +417,15 @@ static int snd_emu10k1_playback_prepare(struct snd_pcm_substream *substream)
 
 	start_addr = epcm->start_addr >> w_16;
 	end_addr = start_addr + runtime->period_size;
-	snd_emu10k1_pcm_init_voice(emu, 1, 1, epcm->extra, w_16, false,
-				   start_addr, end_addr, NULL);
+	snd_emu10k1_pcm_init_extra_voice(emu, epcm->extra, w_16,
+					 start_addr, end_addr);
 	start_addr >>= stereo;
 	epcm->ccca_start_addr = start_addr;
 	end_addr = start_addr + runtime->buffer_size;
-	snd_emu10k1_pcm_init_voice(emu, 1, 0, epcm->voices[0], w_16, stereo,
-				   start_addr, end_addr,
-				   &emu->pcm_mixer[substream->number]);
-	if (stereo)
-		snd_emu10k1_pcm_init_voice(emu, 0, 0, epcm->voices[0] + 1, w_16, true,
-					   start_addr, end_addr,
-					   &emu->pcm_mixer[substream->number]);
+	snd_emu10k1_pcm_init_voices(emu, epcm->voices[0], w_16, stereo,
+				    start_addr, end_addr,
+				    &emu->pcm_mixer[substream->number]);
+
 	return 0;
 }
 
@@ -421,8 +442,8 @@ static int snd_emu10k1_efx_playback_prepare(struct snd_pcm_substream *substream)
 
 	channel_size = runtime->buffer_size;
 
-	snd_emu10k1_pcm_init_voice(emu, 1, 1, epcm->extra, true, false,
-				   start_addr, start_addr + (channel_size / 2), NULL);
+	snd_emu10k1_pcm_init_extra_voice(emu, epcm->extra, true,
+					 start_addr, start_addr + (channel_size / 2));
 
 	epcm->ccca_start_addr = start_addr;
 	for (i = 0; i < NUM_EFX_PLAYBACK; i++) {
@@ -598,12 +619,31 @@ static void snd_emu10k1_playback_unmute_voice(struct snd_emu10k1 *emu,
 	snd_emu10k1_playback_commit_volume(emu, evoice, vattn);
 }	
 
+static void snd_emu10k1_playback_unmute_voices(struct snd_emu10k1 *emu,
+					       struct snd_emu10k1_voice *evoice,
+					       bool stereo,
+					       struct snd_emu10k1_pcm_mixer *mix)
+{
+	snd_emu10k1_playback_unmute_voice(emu, evoice, stereo, true, mix);
+	if (stereo)
+		snd_emu10k1_playback_unmute_voice(emu, evoice + 1, true, false, mix);
+}
+
 static void snd_emu10k1_playback_mute_voice(struct snd_emu10k1 *emu,
 					    struct snd_emu10k1_voice *evoice)
 {
 	snd_emu10k1_playback_commit_volume(emu, evoice, 0);
 }
 
+static void snd_emu10k1_playback_mute_voices(struct snd_emu10k1 *emu,
+					     struct snd_emu10k1_voice *evoice,
+					     bool stereo)
+{
+	snd_emu10k1_playback_mute_voice(emu, evoice);
+	if (stereo)
+		snd_emu10k1_playback_mute_voice(emu, evoice + 1);
+}
+
 static void snd_emu10k1_playback_commit_pitch(struct snd_emu10k1 *emu,
 					      u32 voice, u32 pitch_target)
 {
@@ -680,22 +720,18 @@ static int snd_emu10k1_playback_trigger(struct snd_pcm_substream *substream,
 	case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
 	case SNDRV_PCM_TRIGGER_RESUME:
 		mix = &emu->pcm_mixer[substream->number];
-		snd_emu10k1_playback_unmute_voice(emu, epcm->voices[0], stereo, true, mix);
-		if (stereo)
-			snd_emu10k1_playback_unmute_voice(emu, epcm->voices[0] + 1, true, false, mix);
+		snd_emu10k1_playback_unmute_voices(emu, epcm->voices[0], stereo, mix);
 		snd_emu10k1_playback_set_running(emu, epcm);
 		snd_emu10k1_playback_trigger_voice(emu, epcm->voices[0]);
 		snd_emu10k1_playback_trigger_voice(emu, epcm->extra);
 		break;
 	case SNDRV_PCM_TRIGGER_STOP:
 	case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
 	case SNDRV_PCM_TRIGGER_SUSPEND:
 		snd_emu10k1_playback_stop_voice(emu, epcm->voices[0]);
 		snd_emu10k1_playback_stop_voice(emu, epcm->extra);
 		snd_emu10k1_playback_set_stopped(emu, epcm);
-		snd_emu10k1_playback_mute_voice(emu, epcm->voices[0]);
-		if (stereo)
-			snd_emu10k1_playback_mute_voice(emu, epcm->voices[0] + 1);
+		snd_emu10k1_playback_mute_voices(emu, epcm->voices[0], stereo);
 		break;
 	default:
 		result = -EINVAL;
-- 
2.40.0.152.g15d061e6df


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

* [PATCH 2/2] ALSA: emu10k1: pass raw FX send config to snd_emu10k1_pcm_init_voice()
  2023-05-23 10:46 [PATCH 1/2] ALSA: emu10k1: introduce higher-level voice manipulation functions Oswald Buddenhagen
@ 2023-05-23 10:46 ` Oswald Buddenhagen
  2023-05-23 12:14 ` [PATCH 1/2] ALSA: emu10k1: introduce higher-level voice manipulation functions Takashi Iwai
  1 sibling, 0 replies; 3+ messages in thread
From: Oswald Buddenhagen @ 2023-05-23 10:46 UTC (permalink / raw)
  To: alsa-devel; +Cc: Takashi Iwai, Jaroslav Kysela

... instead of passing in a high-level mixer struct. Let the
higher-level functions handle the differences between the voice types.

Signed-off-by: Oswald Buddenhagen <oswald.buddenhagen@gmx.de>
---
 sound/pci/emu10k1/emupcm.c | 54 +++++++++++++++++---------------------
 1 file changed, 24 insertions(+), 30 deletions(-)

diff --git a/sound/pci/emu10k1/emupcm.c b/sound/pci/emu10k1/emupcm.c
index 65af94d08b47..0572dfb80943 100644
--- a/sound/pci/emu10k1/emupcm.c
+++ b/sound/pci/emu10k1/emupcm.c
@@ -233,37 +233,21 @@ static u16 emu10k1_send_target_from_amount(u8 amount)
 }
 
 static void snd_emu10k1_pcm_init_voice(struct snd_emu10k1 *emu,
-				       int master, int extra,
 				       struct snd_emu10k1_voice *evoice,
 				       bool w_16, bool stereo,
 				       unsigned int start_addr,
 				       unsigned int end_addr,
-				       struct snd_emu10k1_pcm_mixer *mix)
+				       const unsigned char *send_routing,
+				       const unsigned char *send_amount)
 {
 	struct snd_pcm_substream *substream = evoice->epcm->substream;
 	struct snd_pcm_runtime *runtime = substream->runtime;
-	unsigned int silent_page, tmp;
+	unsigned int silent_page;
 	int voice;
-	unsigned char send_amount[8];
-	unsigned char send_routing[8];
-	unsigned long flags;
 	unsigned int pitch_target;
 
 	voice = evoice->number;
 
-	spin_lock_irqsave(&emu->reg_lock, flags);
-
-	/* volume parameters */
-	if (extra) {
-		for (int i = 0; i < 8; i++)
-			send_routing[i] = i;
-		memset(send_amount, 0, sizeof(send_amount));
-	} else {
-		/* mono, left, right (master voice = left) */
-		tmp = stereo ? (master ? 1 : 2) : 0;
-		memcpy(send_routing, &mix->send_routing[tmp][0], 8);
-		memcpy(send_amount, &mix->send_volume[tmp][0], 8);
-	}
 	if (emu->card_capabilities->emu_model)
 		pitch_target = PITCH_48000; /* Disable interpolators on emu1010 card */
 	else
@@ -308,32 +292,42 @@ static void snd_emu10k1_pcm_init_voice(struct snd_emu10k1 *emu,
 	}
 
 	emu->voices[voice].dirty = 1;
-
-	spin_unlock_irqrestore(&emu->reg_lock, flags);
 }
 
 static void snd_emu10k1_pcm_init_voices(struct snd_emu10k1 *emu,
 					struct snd_emu10k1_voice *evoice,
 					bool w_16, bool stereo,
 					unsigned int start_addr,
 					unsigned int end_addr,
 					struct snd_emu10k1_pcm_mixer *mix)
 {
-	snd_emu10k1_pcm_init_voice(emu, 1, 0, evoice, w_16, stereo,
-				   start_addr, end_addr, mix);
+	unsigned long flags;
+
+	spin_lock_irqsave(&emu->reg_lock, flags);
+	snd_emu10k1_pcm_init_voice(emu, evoice, w_16, stereo,
+				   start_addr, end_addr,
+				   &mix->send_routing[stereo][0],
+				   &mix->send_volume[stereo][0]);
 	if (stereo)
-		snd_emu10k1_pcm_init_voice(emu, 0, 0, evoice + 1, w_16, true,
-					   start_addr, end_addr, mix);
+		snd_emu10k1_pcm_init_voice(emu, evoice + 1, w_16, true,
+					   start_addr, end_addr,
+					   &mix->send_routing[2][0],
+					   &mix->send_volume[2][0]);
+	spin_unlock_irqrestore(&emu->reg_lock, flags);
 }
 
 static void snd_emu10k1_pcm_init_extra_voice(struct snd_emu10k1 *emu,
 					     struct snd_emu10k1_voice *evoice,
 					     bool w_16,
 					     unsigned int start_addr,
 					     unsigned int end_addr)
 {
-	snd_emu10k1_pcm_init_voice(emu, 1, 1, evoice, w_16, false,
-				   start_addr, end_addr, NULL);
+	static const unsigned char send_routing[8] = { 0, 1, 2, 3, 4, 5, 6, 7 };
+	static const unsigned char send_amount[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
+
+	snd_emu10k1_pcm_init_voice(emu, evoice, w_16, false,
+				   start_addr, end_addr,
+				   send_routing, send_amount);
 }
 
 static int snd_emu10k1_playback_hw_params(struct snd_pcm_substream *substream,
@@ -447,9 +441,9 @@ static int snd_emu10k1_efx_playback_prepare(struct snd_pcm_substream *substream)
 
 	epcm->ccca_start_addr = start_addr;
 	for (i = 0; i < NUM_EFX_PLAYBACK; i++) {
-		snd_emu10k1_pcm_init_voice(emu, 0, 0, epcm->voices[i], true, false,
-					   start_addr, start_addr + channel_size,
-					   &emu->efx_pcm_mixer[i]);
+		snd_emu10k1_pcm_init_voices(emu, epcm->voices[i], true, false,
+					    start_addr, start_addr + channel_size,
+					    &emu->efx_pcm_mixer[i]);
 		start_addr += channel_size;
 	}
 
-- 
2.40.0.152.g15d061e6df


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

* Re: [PATCH 1/2] ALSA: emu10k1: introduce higher-level voice manipulation functions
  2023-05-23 10:46 [PATCH 1/2] ALSA: emu10k1: introduce higher-level voice manipulation functions Oswald Buddenhagen
  2023-05-23 10:46 ` [PATCH 2/2] ALSA: emu10k1: pass raw FX send config to snd_emu10k1_pcm_init_voice() Oswald Buddenhagen
@ 2023-05-23 12:14 ` Takashi Iwai
  1 sibling, 0 replies; 3+ messages in thread
From: Takashi Iwai @ 2023-05-23 12:14 UTC (permalink / raw)
  To: Oswald Buddenhagen; +Cc: alsa-devel, Jaroslav Kysela

On Tue, 23 May 2023 12:46:11 +0200,
Oswald Buddenhagen wrote:
> 
> This adds snd_emu10k1_pcm_init_{voices,extra_voice}() and
> snd_emu10k1_playback_{un,}mute_voices() to slightly abstract by voice
> function and potential stereo property.
> 
> Signed-off-by: Oswald Buddenhagen <oswald.buddenhagen@gmx.de>

Applied both patches now.  Thanks.


Takashi

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

end of thread, other threads:[~2023-05-23 12:15 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-05-23 10:46 [PATCH 1/2] ALSA: emu10k1: introduce higher-level voice manipulation functions Oswald Buddenhagen
2023-05-23 10:46 ` [PATCH 2/2] ALSA: emu10k1: pass raw FX send config to snd_emu10k1_pcm_init_voice() Oswald Buddenhagen
2023-05-23 12:14 ` [PATCH 1/2] ALSA: emu10k1: introduce higher-level voice manipulation functions Takashi Iwai

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