On 2020-01-05 02:58, Programmingkid wrote:
I found the patch that breaks Screamer sound support for qemu-system-ppc. It is
this:
commit 2ceb8240fa4e4e30fb853565eb2bed3032d74f62
Author: Kővágó, Zoltán <dirty.ice...@gmail.com>
Date: Thu Sep 19 23:24:11 2019 +0200
coreaudio: port to the new audio backend api
Signed-off-by: Kővágó, Zoltán <dirty.ice...@gmail.com>
Message-id:
586a1e66de5cbc6c5234f9ae556d24befb6afada.1568927990.git.dirty.ice...@gmail.com
Signed-off-by: Gerd Hoffmann <kra...@redhat.com>
Reversing this patch should make the Screamer patch work with the current git
version of QEMU.
Hi,
Unfortunately it's not that simple to simply revert the patch since the
old backend api no longer exists. Also I don't have a Mac so it's
almost impossible for me to test the results. I looked at the specified
commit and I think I found a problem, could you please apply the
attached patch on the current git master and check whether it solves the
problem? If yes I'll turn it into a proper patch.
Regards,
Zoltan
diff --git a/audio/audio_template.h b/audio/audio_template.h
index 3287d7075e..a7b46b8363 100644
--- a/audio/audio_template.h
+++ b/audio/audio_template.h
@@ -153,6 +153,13 @@ static int glue (audio_pcm_sw_init_, TYPE) (
sw->ratio = ((int64_t) sw->info.freq << 32) / sw->hw->info.freq;
#endif
+#ifdef FLOAT_MIXENG
+#ifdef DAC
+ sw->conv = mixeng_conv_float;
+#else
+ sw->clip = mixeng_clip_float;
+#endif
+#else
#ifdef DAC
sw->conv = mixeng_conv
#else
@@ -162,6 +169,7 @@ static int glue (audio_pcm_sw_init_, TYPE) (
[sw->info.sign]
[sw->info.swap_endianness]
[audio_bits_to_index (sw->info.bits)];
+#endif
sw->name = g_strdup (name);
err = glue (audio_pcm_sw_alloc_resources_, TYPE) (sw);
diff --git a/audio/mixeng.h b/audio/mixeng.h
index 18e62c7c49..343f5fb810 100644
--- a/audio/mixeng.h
+++ b/audio/mixeng.h
@@ -41,6 +41,11 @@ typedef void (f_sample) (void *dst, const struct st_sample *src, int samples);
extern t_sample *mixeng_conv[2][2][2][3];
extern f_sample *mixeng_clip[2][2][2][3];
+#ifdef FLOAT_MIXENG
+void mixeng_conv_float(struct st_sample *dst, const void *src, int samples);
+void mixeng_clip_float(void *dst, const struct st_sample *src, int samples);
+#endif
+
void *st_rate_start (int inrate, int outrate);
void st_rate_flow(void *opaque, st_sample *ibuf, st_sample *obuf,
size_t *isamp, size_t *osamp);
diff --git a/audio/coreaudio.c b/audio/coreaudio.c
index 66f0f459cf..4e7e509ad0 100644
--- a/audio/coreaudio.c
+++ b/audio/coreaudio.c
@@ -471,20 +471,6 @@ static OSStatus audioDeviceIOProc(
return 0;
}
-static UInt32 coreaudio_get_flags(struct audio_pcm_info *info,
- struct audsettings *as)
-{
- UInt32 flags = info->sign ? kAudioFormatFlagIsSignedInteger : 0;
- if (as->endianness) { /* 0 = little, 1 = big */
- flags |= kAudioFormatFlagIsBigEndian;
- }
-
- if (flags == 0) { /* must not be 0 */
- flags = kAudioFormatFlagsAreAllClear;
- }
- return flags;
-}
-
static int coreaudio_init_out(HWVoiceOut *hw, struct audsettings *as,
void *drv_opaque)
{
@@ -572,15 +558,6 @@ static int coreaudio_init_out(HWVoiceOut *hw, struct audsettings *as,
/* set Samplerate */
core->outputStreamBasicDescription.mSampleRate = (Float64) as->freq;
- core->outputStreamBasicDescription.mFormatID = kAudioFormatLinearPCM;
- core->outputStreamBasicDescription.mFormatFlags =
- coreaudio_get_flags(&hw->info, as);
- core->outputStreamBasicDescription.mBytesPerPacket =
- core->outputStreamBasicDescription.mBytesPerFrame =
- hw->info.nchannels * hw->info.bits / 8;
- core->outputStreamBasicDescription.mFramesPerPacket = 1;
- core->outputStreamBasicDescription.mChannelsPerFrame = hw->info.nchannels;
- core->outputStreamBasicDescription.mBitsPerChannel = hw->info.bits;
status = coreaudio_set_streamformat(core->outputDeviceID,
&core->outputStreamBasicDescription);
diff --git a/audio/mixeng.c b/audio/mixeng.c
index 2f5ba71381..424ffe30d7 100644
--- a/audio/mixeng.c
+++ b/audio/mixeng.c
@@ -267,6 +267,27 @@ f_sample *mixeng_clip[2][2][2][3] = {
}
};
+#ifdef FLOAT_MIXENG
+void mixeng_conv_float(struct st_sample *dst, const void *src, int samples)
+{
+ float *in = (float *) src;
+ while (samples--) {
+ dst->l = *in++;
+ dst->r = *in++;
+ dst++;
+ }
+}
+
+void mixeng_clip_float(void *dst, const struct st_sample *src, int samples)
+{
+ float *out = (float *) dst;
+ while (samples--) {
+ *out++ = src->l;
+ *out++ = src->r;
+ src++;
+ }
+}
+#endif
void audio_sample_to_uint64(void *samples, int pos,
uint64_t *left, uint64_t *right)