multi media addon builds on beos, fixed include missing

added B_AUDIO_INT support and valid_bits use


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@16254 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Jérôme Duval 2006-02-06 17:59:50 +00:00
parent ff14d2457a
commit f616df6a18
5 changed files with 55 additions and 10 deletions

View File

@ -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

View File

@ -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) {

View File

@ -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);

View File

@ -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:

View File

@ -35,6 +35,7 @@
#include <BufferProducer.h>
#include <Controllable.h>
#include <MediaEventLooper.h>
#include <ParameterWeb.h>
#include <TimeSource.h>
#include <Controllable.h>
#include <File.h>