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)
{
Audiodev *dev = drv_opaque;
AudiodevCoreaudioPerDirectionOptions *cpdo = dev->u.coreaudio.out;
int frames;
+ struct audsettings fake_as;
/* create mutex */
err = pthread_mutex_init(&core->mutex, NULL);
return -1;
}
+ /*
+ * The canonical audio format for CoreAudio on macOS is float. Currently
+ * there is no generic code for AUDIO_FORMAT_F32 in qemu. Here we select
+ * AUDIO_FORMAT_S32 instead because only the sample size has to match.
+ */
+ fake_as = *as;
+ as = &fake_as;
+ as->fmt = AUDIO_FORMAT_S32;
audio_pcm_init_info (&hw->info, as);
status = coreaudio_get_voice(&core->outputDeviceID);
/* 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);
}
};
+void conv_natural_float_to_stereo(struct st_sample *dst, const void *src,
+ int samples)
+{
+ float *in = (float *)src;
+#ifndef FLOAT_MIXENG
+ const float scale = UINT_MAX;
+#endif
+
+ while (samples--) {
+#ifdef FLOAT_MIXENG
+ dst->l = *in++;
+ dst->r = *in++;
+#else
+ dst->l = *in++ * scale;
+ dst->r = *in++ * scale;
+#endif
+ dst++;
+ }
+}
+
+void clip_natural_float_from_stereo(void *dst, const struct st_sample *src,
+ int samples)
+{
+ float *out = (float *)dst;
+#ifndef FLOAT_MIXENG
+#ifdef RECIPROCAL
+ const float scale = 1.f / UINT_MAX;
+#else
+ const float scale = UINT_MAX;
+#endif
+#endif
+
+ while (samples--) {
+#ifdef FLOAT_MIXENG
+ *out++ = src->l;
+ *out++ = src->r;
+#else
+#ifdef RECIPROCAL
+ *out++ = src->l * scale;
+ *out++ = src->r * scale;
+#else
+ *out++ = src->l / scale;
+ *out++ = src->r / scale;
+#endif
+#endif
+ src++;
+ }
+}
void audio_sample_to_uint64(void *samples, int pos,
uint64_t *left, uint64_t *right)
extern t_sample *mixeng_conv[2][2][2][3];
extern f_sample *mixeng_clip[2][2][2][3];
+void conv_natural_float_to_stereo(struct st_sample *dst, const void *src,
+ int samples);
+void clip_natural_float_from_stereo(void *dst, const struct st_sample *src,
+ int samples);
+
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);