* [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