All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/2] ALSA: emu10k1: various improvements to the DSP-based mixer code
@ 2023-05-18 14:03 Oswald Buddenhagen
  2023-05-18 14:03 ` [PATCH 1/2] ALSA: emu10k1: enable bit-exact playback, part 3: pitch Oswald Buddenhagen
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: Oswald Buddenhagen @ 2023-05-18 14:03 UTC (permalink / raw)
  To: alsa-devel; +Cc: Takashi Iwai, Jaroslav Kysela


Oswald Buddenhagen (2):
  ALSA: emu10k1: enable bit-exact playback, part 3: pitch
  ALSA: emu10k1: enable bit-exact playback, part 4: send amounts

 include/sound/emu10k1.h    |  2 ++
 sound/pci/emu10k1/emupcm.c | 34 ++++++++++++++++++++++++++++++----
 2 files changed, 32 insertions(+), 4 deletions(-)

-- 
2.40.0.152.g15d061e6df


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

* [PATCH 1/2] ALSA: emu10k1: enable bit-exact playback, part 3: pitch
  2023-05-18 14:03 [PATCH 0/2] ALSA: emu10k1: various improvements to the DSP-based mixer code Oswald Buddenhagen
@ 2023-05-18 14:03 ` Oswald Buddenhagen
  2023-05-18 14:03 ` [PATCH 2/2] ALSA: emu10k1: enable bit-exact playback, part 4: send amounts Oswald Buddenhagen
  2023-05-18 14:57 ` [PATCH 0/2] ALSA: emu10k1: various improvements to the DSP-based mixer code Takashi Iwai
  2 siblings, 0 replies; 4+ messages in thread
From: Oswald Buddenhagen @ 2023-05-18 14:03 UTC (permalink / raw)
  To: alsa-devel; +Cc: Takashi Iwai, Jaroslav Kysela

CPF_CURRENTPITCH starts swerving towards PTRX_PITCHTARGET as soon as
that is set. In practice this means that CPF_FRACADDRESS may acquire a
non-zero value before we manage to force CPF_CURRENTPITCH to the final
value, which would prevent bit-for-bit reproduction.

To avoid that this state persists, we now reset CPF_FRACADDRESS when
setting CPF_CURRENTPITCH, and to (mostly) avoid that it progresses too
far in the first place (possibly even reaching CCCA_CURRADDR), we write
PTRX and CPF in one critical section (though NMIs, etc. still make this
unreliable).

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

diff --git a/sound/pci/emu10k1/emupcm.c b/sound/pci/emu10k1/emupcm.c
index 1ca16f0ddbed..0b23ff8d9c3b 100644
--- a/sound/pci/emu10k1/emupcm.c
+++ b/sound/pci/emu10k1/emupcm.c
@@ -601,6 +601,17 @@ static void snd_emu10k1_playback_mute_voice(struct snd_emu10k1 *emu,
 	snd_emu10k1_playback_commit_volume(emu, evoice, 0);
 }
 
+static void snd_emu10k1_playback_commit_pitch(struct snd_emu10k1 *emu,
+					      u32 voice, u32 pitch_target)
+{
+	u32 ptrx = snd_emu10k1_ptr_read(emu, PTRX, voice);
+	u32 cpf = snd_emu10k1_ptr_read(emu, CPF, voice);
+	snd_emu10k1_ptr_write_multiple(emu, voice,
+		PTRX, (ptrx & ~PTRX_PITCHTARGET_MASK) | pitch_target,
+		CPF, (cpf & ~(CPF_CURRENTPITCH_MASK | CPF_FRACADDRESS_MASK)) | pitch_target,
+		REGLIST_END);
+}
+
 static void snd_emu10k1_playback_trigger_voice(struct snd_emu10k1 *emu,
 					       struct snd_emu10k1_voice *evoice)
 {
@@ -616,18 +627,16 @@ static void snd_emu10k1_playback_trigger_voice(struct snd_emu10k1 *emu,
 		pitch_target = PITCH_48000; /* Disable interpolators on emu1010 card */
 	else 
 		pitch_target = emu10k1_calc_pitch_target(runtime->rate);
-	snd_emu10k1_ptr_write(emu, PTRX_PITCHTARGET, voice, pitch_target);
-	snd_emu10k1_ptr_write(emu, CPF_CURRENTPITCH, voice, pitch_target);
+	snd_emu10k1_playback_commit_pitch(emu, voice, pitch_target << 16);
 }
 
 static void snd_emu10k1_playback_stop_voice(struct snd_emu10k1 *emu,
 					    struct snd_emu10k1_voice *evoice)
 {
 	unsigned int voice;
 
 	voice = evoice->number;
-	snd_emu10k1_ptr_write(emu, PTRX_PITCHTARGET, voice, 0);
-	snd_emu10k1_ptr_write(emu, CPF_CURRENTPITCH, voice, 0);
+	snd_emu10k1_playback_commit_pitch(emu, voice, 0);
 }
 
 static void snd_emu10k1_playback_set_running(struct snd_emu10k1 *emu,
-- 
2.40.0.152.g15d061e6df


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

* [PATCH 2/2] ALSA: emu10k1: enable bit-exact playback, part 4: send amounts
  2023-05-18 14:03 [PATCH 0/2] ALSA: emu10k1: various improvements to the DSP-based mixer code Oswald Buddenhagen
  2023-05-18 14:03 ` [PATCH 1/2] ALSA: emu10k1: enable bit-exact playback, part 3: pitch Oswald Buddenhagen
@ 2023-05-18 14:03 ` Oswald Buddenhagen
  2023-05-18 14:57 ` [PATCH 0/2] ALSA: emu10k1: various improvements to the DSP-based mixer code Takashi Iwai
  2 siblings, 0 replies; 4+ messages in thread
From: Oswald Buddenhagen @ 2023-05-18 14:03 UTC (permalink / raw)
  To: alsa-devel; +Cc: Takashi Iwai, Jaroslav Kysela

On Audigy, the send amounts are merely targets, presumably to avoid
sound distortion due to sudden changes, which the EMU8K docu explicitly
warns about.

However, that "soft-start" would prevent bit-for-bit reproduction, so
we now force the current send amounts to their final values at PCM
playback init.

One might want to do that for the MIDI synthesizer as well, though it
seems mostly pointless due to the attack phase each note has anyway.

Signed-off-by: Oswald Buddenhagen <oswald.buddenhagen@gmx.de>
---
 include/sound/emu10k1.h    |  2 ++
 sound/pci/emu10k1/emupcm.c | 17 +++++++++++++++++
 2 files changed, 19 insertions(+)

diff --git a/include/sound/emu10k1.h b/include/sound/emu10k1.h
index 9c5de1f45566..583fabef0b99 100644
--- a/include/sound/emu10k1.h
+++ b/include/sound/emu10k1.h
@@ -709,6 +709,8 @@ SUB_REG(PEFE, FILTERAMOUNT,	0x000000ff)	/* Filter envlope amount				*/
 #define ADCBS_BUFSIZE_57344	0x0000001e
 #define ADCBS_BUFSIZE_65536	0x0000001f
 
+// On Audigy, the FX send amounts are not applied instantly, but determine
+// targets towards which the following registers swerve gradually.
 #define A_CSBA			0x4c		/* FX send B & A current amounts			*/
 #define A_CSDC			0x4d		/* FX send D & C current amounts			*/
 #define A_CSFE			0x4e		/* FX send F & E current amounts			*/
diff --git a/sound/pci/emu10k1/emupcm.c b/sound/pci/emu10k1/emupcm.c
index 0b23ff8d9c3b..903a68a4d396 100644
--- a/sound/pci/emu10k1/emupcm.c
+++ b/sound/pci/emu10k1/emupcm.c
@@ -236,6 +236,18 @@ static unsigned int emu10k1_select_interprom(unsigned int pitch_target)
 		return CCCA_INTERPROM_2;
 }
 
+static u16 emu10k1_send_target_from_amount(u8 amount)
+{
+	static const u8 shifts[8] = { 4, 4, 5, 6, 7, 8, 9, 10 };
+	static const u16 offsets[8] = { 0, 0x200, 0x400, 0x800, 0x1000, 0x2000, 0x4000, 0x8000 };
+	u8 exp;
+
+	if (amount == 0xff)
+		return 0xffff;
+	exp = amount >> 5;
+	return ((amount & 0x1f) << shifts[exp]) + offsets[exp];
+}
+
 static void snd_emu10k1_pcm_init_voice(struct snd_emu10k1 *emu,
 				       int master, int extra,
 				       struct snd_emu10k1_voice *evoice,
@@ -301,6 +313,11 @@ static void snd_emu10k1_pcm_init_voice(struct snd_emu10k1 *emu,
 			A_FXRT2, snd_emu10k1_compose_audigy_fxrt2(send_routing),
 			A_SENDAMOUNTS, snd_emu10k1_compose_audigy_sendamounts(send_amount),
 			REGLIST_END);
+		for (int i = 0; i < 4; i++) {
+			u32 aml = emu10k1_send_target_from_amount(send_amount[2 * i]);
+			u32 amh = emu10k1_send_target_from_amount(send_amount[2 * i + 1]);
+			snd_emu10k1_ptr_write(emu, A_CSBA + i, voice, (amh << 16) | aml);
+		}
 	} else {
 		snd_emu10k1_ptr_write(emu, FXRT, voice,
 				      snd_emu10k1_compose_send_routing(send_routing));
-- 
2.40.0.152.g15d061e6df


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

* Re: [PATCH 0/2] ALSA: emu10k1: various improvements to the DSP-based mixer code
  2023-05-18 14:03 [PATCH 0/2] ALSA: emu10k1: various improvements to the DSP-based mixer code Oswald Buddenhagen
  2023-05-18 14:03 ` [PATCH 1/2] ALSA: emu10k1: enable bit-exact playback, part 3: pitch Oswald Buddenhagen
  2023-05-18 14:03 ` [PATCH 2/2] ALSA: emu10k1: enable bit-exact playback, part 4: send amounts Oswald Buddenhagen
@ 2023-05-18 14:57 ` Takashi Iwai
  2 siblings, 0 replies; 4+ messages in thread
From: Takashi Iwai @ 2023-05-18 14:57 UTC (permalink / raw)
  To: Oswald Buddenhagen; +Cc: alsa-devel, Jaroslav Kysela

On Thu, 18 May 2023 16:03:37 +0200,
Oswald Buddenhagen wrote:
> 
> 
> Oswald Buddenhagen (2):
>   ALSA: emu10k1: enable bit-exact playback, part 3: pitch
>   ALSA: emu10k1: enable bit-exact playback, part 4: send amounts

Applied both patches now.  Thanks.


Takashi

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

end of thread, other threads:[~2023-05-18 14:58 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-05-18 14:03 [PATCH 0/2] ALSA: emu10k1: various improvements to the DSP-based mixer code Oswald Buddenhagen
2023-05-18 14:03 ` [PATCH 1/2] ALSA: emu10k1: enable bit-exact playback, part 3: pitch Oswald Buddenhagen
2023-05-18 14:03 ` [PATCH 2/2] ALSA: emu10k1: enable bit-exact playback, part 4: send amounts Oswald Buddenhagen
2023-05-18 14:57 ` [PATCH 0/2] ALSA: emu10k1: various improvements to the DSP-based mixer code Takashi Iwai

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.