diff --git a/src/add-ons/media/media-add-ons/multi_audio/Jamfile b/src/add-ons/media/media-add-ons/multi_audio/Jamfile index 41b9d94c85..1b484ec436 100644 --- a/src/add-ons/media/media-add-ons/multi_audio/Jamfile +++ b/src/add-ons/media/media-add-ons/multi_audio/Jamfile @@ -2,6 +2,10 @@ SubDir HAIKU_TOP src add-ons media media-add-ons multi_audio ; SetSubDirSupportedPlatformsBeOSCompatible ; +if $(TARGET_PLATFORM) != haiku { + SubDirC++Flags -fmultiple-symbol-spaces ; +} + Addon multi_audio.media_addon : media : MultiAudioAddOn.cpp MultiAudioDevice.cpp diff --git a/src/add-ons/media/media-add-ons/multi_audio/MultiAudioDevice.cpp b/src/add-ons/media/media-add-ons/multi_audio/MultiAudioDevice.cpp index 2e0ae6840d..a4f2693ba2 100644 --- a/src/add-ons/media/media-add-ons/multi_audio/MultiAudioDevice.cpp +++ b/src/add-ons/media/media-add-ons/multi_audio/MultiAudioDevice.cpp @@ -83,6 +83,25 @@ uint32 MultiAudioDevice::convert_multiaudio_format_to_media_format(uint32 fmt) } } + +int16 MultiAudioDevice::convert_multiaudio_format_to_valid_bits(uint32 fmt) +{ + switch(fmt) { + case B_FMT_18BIT: + return 18; + case B_FMT_20BIT: + return 20; + case B_FMT_24BIT: + return 24; + case B_FMT_32BIT: + return 32; + default: { + return 0; + } + } +} + + uint32 MultiAudioDevice::convert_media_format_to_multiaudio_format(uint32 fmt) { switch(fmt) { diff --git a/src/add-ons/media/media-add-ons/multi_audio/MultiAudioDevice.h b/src/add-ons/media/media-add-ons/multi_audio/MultiAudioDevice.h index df9d123a01..384ab349ec 100644 --- a/src/add-ons/media/media-add-ons/multi_audio/MultiAudioDevice.h +++ b/src/add-ons/media/media-add-ons/multi_audio/MultiAudioDevice.h @@ -45,6 +45,7 @@ public: static float convert_multiaudio_rate_to_media_rate(uint32 rate); static uint32 convert_media_rate_to_multiaudio_rate(float rate); static uint32 convert_multiaudio_format_to_media_format(uint32 fmt); + static int16 convert_multiaudio_format_to_valid_bits(uint32 fmt); static uint32 convert_media_format_to_multiaudio_format(uint32 fmt); static uint32 select_multiaudio_rate(uint32 rate); static uint32 select_multiaudio_format(uint32 fmt); diff --git a/src/add-ons/media/media-add-ons/multi_audio/MultiAudioNode.cpp b/src/add-ons/media/media-add-ons/multi_audio/MultiAudioNode.cpp index 40e5bb52c7..863e22f149 100644 --- a/src/add-ons/media/media-add-ons/multi_audio/MultiAudioNode.cpp +++ b/src/add-ons/media/media-add-ons/multi_audio/MultiAudioNode.cpp @@ -137,6 +137,7 @@ MultiAudioNode::MultiAudioNode(BMediaAddOn *addon, char* name, MultiAudioDevice memset(&fPreferredFormat, 0, sizeof(fPreferredFormat)); // set everything to wildcard first fPreferredFormat.type = B_MEDIA_RAW_AUDIO; fPreferredFormat.u.raw_audio.format = MultiAudioDevice::convert_multiaudio_format_to_media_format(fDevice->MFI.output.format); + fPreferredFormat.u.raw_audio.valid_bits = MultiAudioDevice::convert_multiaudio_format_to_valid_bits(fDevice->MFI.output.format); fPreferredFormat.u.raw_audio.channel_count = 2; fPreferredFormat.u.raw_audio.frame_rate = MultiAudioDevice::convert_multiaudio_rate_to_media_rate(fDevice->MFI.input.rate); // measured in Hertz fPreferredFormat.u.raw_audio.byte_order = B_MEDIA_HOST_ENDIAN; @@ -373,10 +374,11 @@ status_t MultiAudioNode::AcceptFormat( /*if(format->u.raw_audio.format == media_raw_audio_format::B_AUDIO_FLOAT && channel->fPreferredFormat.u.raw_audio.format == media_raw_audio_format::B_AUDIO_SHORT) format->u.raw_audio.format = media_raw_audio_format::B_AUDIO_FLOAT; - else*/ - format->u.raw_audio.format = channel->fPreferredFormat.u.raw_audio.format; //MultiAudioDevice::convert_multiaudio_format_to_media_format(fDevice->MFI.output.format); //media_raw_audio_format::B_AUDIO_SHORT; + else*/ + format->u.raw_audio.format = channel->fPreferredFormat.u.raw_audio.format; + format->u.raw_audio.valid_bits = channel->fPreferredFormat.u.raw_audio.valid_bits; - format->u.raw_audio.frame_rate = channel->fPreferredFormat.u.raw_audio.frame_rate;//MultiAudioDevice::convert_multiaudio_rate_to_media_rate(fDevice->MFI.output.rate); //48000.0; + format->u.raw_audio.frame_rate = channel->fPreferredFormat.u.raw_audio.frame_rate; format->u.raw_audio.channel_count = channel->fPreferredFormat.u.raw_audio.channel_count; format->u.raw_audio.byte_order = B_MEDIA_HOST_ENDIAN; format->u.raw_audio.buffer_size = fDevice->MBL.return_playback_buffer_size @@ -760,12 +762,7 @@ MultiAudioNode::PrepareToConnect(const media_source& what, const media_destinati fprintf(stderr, "\tnon-raw-audio format?!\n"); return B_MEDIA_BAD_FORMAT; } - else if (format->u.raw_audio.format != media_raw_audio_format::B_AUDIO_SHORT) - { - fprintf(stderr, "\tnon-short-audio format?!\n"); - return B_MEDIA_BAD_FORMAT; - } - + // !!! validate all other fields except for buffer_size here, because the consumer might have // supplied different values from AcceptFormat()? @@ -1677,7 +1674,30 @@ MultiAudioNode::FillNextBuffer(node_input &input, BBuffer* buffer) break; case media_raw_audio_format::B_AUDIO_INT: - + switch(input.fFormat.u.raw_audio.format) { + case media_raw_audio_format::B_AUDIO_FLOAT: + break; + case media_raw_audio_format::B_AUDIO_INT: { + size_t frame_size = input.fInput.format.u.raw_audio.channel_count * sizeof(int32); + size_t stride = fDevice->MBL.playback_buffers[input.fBufferCycle][input.fChannelId].stride; + //PRINT(("stride : %i, frame_size : %i, return_playback_buffer_size : %i\n", stride, frame_size, fDevice->MBL.return_playback_buffer_size)); + for(uint32 channel = 0; channel < input.fInput.format.u.raw_audio.channel_count; channel++) { + char *sample_dest = fDevice->MBL.playback_buffers[input.fBufferCycle][input.fChannelId + channel].base; + //char *sample_src = (char*)buffer->Data() + (input.fInput.format.u.raw_audio.channel_count - 1 - channel) * sizeof(int16); + char *sample_src = (char*)buffer->Data() + channel * sizeof(int32); + for(uint32 i=fDevice->MBL.return_playback_buffer_size; i>0; i--) { + *(int32*)sample_dest = *(int32*)sample_src; + sample_dest += stride; + sample_src += frame_size; + } + } + } + break; + case media_raw_audio_format::B_AUDIO_SHORT: + break; + default: + break; + } break; case media_raw_audio_format::B_AUDIO_SHORT: diff --git a/src/add-ons/media/media-add-ons/multi_audio/MultiAudioNode.h b/src/add-ons/media/media-add-ons/multi_audio/MultiAudioNode.h index 1954836ac5..81f36a1677 100644 --- a/src/add-ons/media/media-add-ons/multi_audio/MultiAudioNode.h +++ b/src/add-ons/media/media-add-ons/multi_audio/MultiAudioNode.h @@ -35,6 +35,7 @@ #include #include #include +#include #include #include #include