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)