From 5da3fbc8efbe27a16162d86e250916a5fc4da765 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Tue, 25 Mar 2008 19:19:29 +0000 Subject: [PATCH] * Moved general multi_audio functions into their own file MultiAudioUtility.cpp; they don't really belong to the MultiAudioDevice class. * Major coding style cleanup, part I - no functional change, I hope :-) git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@24578 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../media/media-add-ons/multi_audio/Jamfile | 1 + .../multi_audio/MultiAudioAddOn.cpp | 129 +-- .../multi_audio/MultiAudioDevice.cpp | 419 ++++----- .../multi_audio/MultiAudioDevice.h | 71 +- .../multi_audio/MultiAudioNode.cpp | 830 +++++++++--------- .../multi_audio/MultiAudioNode.h | 138 +-- .../multi_audio/MultiAudioUtility.cpp | 235 +++++ .../multi_audio/MultiAudioUtility.h | 42 + .../media-add-ons/multi_audio/driver_io.h | 26 - 9 files changed, 998 insertions(+), 893 deletions(-) create mode 100644 src/add-ons/media/media-add-ons/multi_audio/MultiAudioUtility.cpp create mode 100644 src/add-ons/media/media-add-ons/multi_audio/MultiAudioUtility.h delete mode 100644 src/add-ons/media/media-add-ons/multi_audio/driver_io.h 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 b8a06a95bf..035f12e2c3 100644 --- a/src/add-ons/media/media-add-ons/multi_audio/Jamfile +++ b/src/add-ons/media/media-add-ons/multi_audio/Jamfile @@ -12,6 +12,7 @@ Addon hmulti_audio.media_addon : MultiAudioAddOn.cpp MultiAudioDevice.cpp MultiAudioNode.cpp + MultiAudioUtility.cpp : be media ; diff --git a/src/add-ons/media/media-add-ons/multi_audio/MultiAudioAddOn.cpp b/src/add-ons/media/media-add-ons/multi_audio/MultiAudioAddOn.cpp index 09fba17427..c56f20298c 100644 --- a/src/add-ons/media/media-add-ons/multi_audio/MultiAudioAddOn.cpp +++ b/src/add-ons/media/media-add-ons/multi_audio/MultiAudioAddOn.cpp @@ -26,15 +26,18 @@ #define MULTI_SAVE -// instantiation function -extern "C" _EXPORT BMediaAddOn * make_media_addon(image_id image) { + +//! instantiation function +extern "C" BMediaAddOn* +make_media_addon(image_id image) +{ CALLED(); return new MultiAudioAddOn(image); } -// -------------------------------------------------------- // -// ctor/dtor -// -------------------------------------------------------- // + +// #pragma mark - + MultiAudioAddOn::~MultiAudioAddOn() { @@ -47,8 +50,9 @@ MultiAudioAddOn::~MultiAudioAddOn() SaveSettings(); } -MultiAudioAddOn::MultiAudioAddOn(image_id image) : - BMediaAddOn(image), + +MultiAudioAddOn::MultiAudioAddOn(image_id image) + : BMediaAddOn(image), fDevices() { CALLED(); @@ -66,80 +70,78 @@ MultiAudioAddOn::MultiAudioAddOn(image_id image) : // BMediaAddOn impl // -------------------------------------------------------- // -status_t MultiAudioAddOn::InitCheck( - const char ** out_failure_text) +status_t +MultiAudioAddOn::InitCheck(const char** _failureText) { CALLED(); return B_OK; } -int32 MultiAudioAddOn::CountFlavors() + +int32 +MultiAudioAddOn::CountFlavors() { CALLED(); return fDevices.CountItems(); } -status_t MultiAudioAddOn::GetFlavorAt( - int32 n, - const flavor_info ** out_info) + +status_t +MultiAudioAddOn::GetFlavorAt(int32 n, const flavor_info** _info) { CALLED(); - if (out_info == 0) { - fprintf(stderr, "<- B_BAD_VALUE\n"); - return B_BAD_VALUE; // we refuse to crash because you were stupid - } - if (n < 0 || n > fDevices.CountItems() - 1) { - fprintf(stderr, "<- B_BAD_INDEX\n"); + if (_info == NULL) + return B_BAD_VALUE; + + MultiAudioDevice* device = (MultiAudioDevice*)fDevices.ItemAt(n); + if (device == NULL) return B_BAD_INDEX; - } - MultiAudioDevice *device = (MultiAudioDevice *) fDevices.ItemAt(n); + flavor_info* info = new (std::nothrow) flavor_info; + if (info == NULL) + return B_NO_MEMORY; - flavor_info * infos = new flavor_info[1]; - MultiAudioNode::GetFlavor(&infos[0], n); - infos[0].name = device->MD.friendly_name; - (*out_info) = infos; + MultiAudioNode::GetFlavor(info, n); + info->name = (char*)device->Description().friendly_name; + + *_info = info; return B_OK; } -BMediaNode * MultiAudioAddOn::InstantiateNodeFor( - const flavor_info * info, - BMessage * config, - status_t * out_error) + +BMediaNode* +MultiAudioAddOn::InstantiateNodeFor(const flavor_info* info, BMessage* config, + status_t* _error) { CALLED(); - if (out_error == 0) { - fprintf(stderr, "<- NULL\n"); - return 0; // we refuse to crash because you were stupid - } + if (_error == NULL) + return NULL; - MultiAudioDevice *device = (MultiAudioDevice*)fDevices.ItemAt(info->internal_id); + MultiAudioDevice* device = (MultiAudioDevice*)fDevices.ItemAt( + info->internal_id); if (device == NULL) { - *out_error = B_ERROR; + *_error = B_ERROR; return NULL; } #ifdef MULTI_SAVE - if (fSettings.FindMessage(device->MD.friendly_name, config) == B_OK) { - fSettings.RemoveData(device->MD.friendly_name); + if (fSettings.FindMessage(device->Description().friendly_name, config) + == B_OK) { + fSettings.RemoveData(device->Description().friendly_name); } #endif - MultiAudioNode * node = - new MultiAudioNode(this, - device->MD.friendly_name, - device, - info->internal_id, - config); - if (node == 0) { - *out_error = B_NO_MEMORY; - fprintf(stderr, "<- B_NO_MEMORY\n"); - } else { - *out_error = node->InitCheck(); - } + MultiAudioNode* node = new (std::nothrow) MultiAudioNode(this, + device->Description().friendly_name, device, info->internal_id, config); + if (node == NULL) + *_error = B_NO_MEMORY; + else + *_error = node->InitCheck(); + return node; } + status_t MultiAudioAddOn::GetConfigurationFor(BMediaNode * your_node, BMessage * into_message) { @@ -172,47 +174,48 @@ MultiAudioAddOn::GetConfigurationFor(BMediaNode * your_node, BMessage * into_mes } -bool MultiAudioAddOn::WantsAutoStart() +bool +MultiAudioAddOn::WantsAutoStart() { CALLED(); return false; } -status_t MultiAudioAddOn::AutoStart( - int in_count, - BMediaNode ** out_node, - int32 * out_internal_id, - bool * out_has_more) + +status_t +MultiAudioAddOn::AutoStart(int count, BMediaNode** _node, int32* _internalID, + bool* _hasMore) { CALLED(); return B_OK; } + status_t -MultiAudioAddOn::RecursiveScan(char* rootPath, BEntry *rootEntry) +MultiAudioAddOn::RecursiveScan(char* rootPath, BEntry* rootEntry) { CALLED(); BDirectory root; if (rootEntry != NULL) root.SetTo(rootEntry); - else if (rootPath != NULL) { + else if (rootPath != NULL) root.SetTo(rootPath); - } else { - PRINT(("Error in MultiAudioAddOn::RecursiveScan null params\n")); + else { + PRINT(("Error in MultiAudioAddOn::RecursiveScan() null params\n")); return B_ERROR; } BEntry entry; while (root.GetNextEntry(&entry) > B_ERROR) { - if (entry.IsDirectory()) { RecursiveScan(rootPath, &entry); } else { BPath path; entry.GetPath(&path); - MultiAudioDevice *device = new MultiAudioDevice(path.Path() + strlen(rootPath), path.Path()); + MultiAudioDevice *device = new MultiAudioDevice(path.Path() + + strlen(rootPath), path.Path()); if (device) { if (device->InitCheck() == B_OK) fDevices.AddItem(device); @@ -227,7 +230,7 @@ MultiAudioAddOn::RecursiveScan(char* rootPath, BEntry *rootEntry) void -MultiAudioAddOn::SaveSettings(void) +MultiAudioAddOn::SaveSettings() { CALLED(); BPath path; @@ -241,7 +244,7 @@ MultiAudioAddOn::SaveSettings(void) void -MultiAudioAddOn::LoadSettings(void) +MultiAudioAddOn::LoadSettings() { CALLED(); fSettings.MakeEmpty(); 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 8d29baf338..40d11371f7 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 @@ -3,343 +3,232 @@ * Distributed under the terms of the MIT License. */ + #include "MultiAudioDevice.h" -#include "debug.h" -#include "driver_io.h" -#include + #include #include -float SAMPLE_RATES[] = { - 8000.0, 11025.0, 12000.0, 16000.0, 22050.0, 24000.0, 32000.0, 44100.0, - 48000.0, 64000.0, 88200.0, 96000.0, 176400.0, 192000.0, 384000.0, 1536000.0 - }; +#include + +#include "debug.h" +#include "MultiAudioUtility.h" -float MultiAudioDevice::convert_multiaudio_rate_to_media_rate(uint32 rate) +using namespace MultiAudio; + + +MultiAudioDevice::MultiAudioDevice(const char* name, const char* path) { - uint8 count = 0; - uint8 size = sizeof(SAMPLE_RATES) / sizeof(SAMPLE_RATES[0]); - while (count < size) { - if (rate & 1) - return SAMPLE_RATES[count]; - count++; - rate >>= 1; - } - return 0.0; + CALLED(); + + strlcpy(fPath, path, B_PATH_NAME_LENGTH); + PRINT(("name: %s, path: %s\n", name, fPath)); + + fInitStatus = _InitDriver(); } -uint32 MultiAudioDevice::convert_media_rate_to_multiaudio_rate(float rate) -{ - uint8 count = 0; - uint size = sizeof(SAMPLE_RATES) / sizeof(SAMPLE_RATES[0]); - while (count < size) { - if (rate <= SAMPLE_RATES[count]) - return (0x1 << count); - count++; - } - return 0; -} - - -uint32 MultiAudioDevice::convert_multiaudio_format_to_media_format(uint32 fmt) -{ - switch (fmt) { - case B_FMT_FLOAT: - return media_raw_audio_format::B_AUDIO_FLOAT; - case B_FMT_18BIT: - case B_FMT_20BIT: - case B_FMT_24BIT: - case B_FMT_32BIT: - return media_raw_audio_format::B_AUDIO_INT; - case B_FMT_16BIT: - return media_raw_audio_format::B_AUDIO_SHORT; - case B_FMT_8BIT_S: - return media_raw_audio_format::B_AUDIO_CHAR; - case B_FMT_8BIT_U: - return media_raw_audio_format::B_AUDIO_UCHAR; - default: - return 0; - } -} - - -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) { - case media_raw_audio_format::B_AUDIO_FLOAT: - return B_FMT_FLOAT; - case media_raw_audio_format::B_AUDIO_INT: - return B_FMT_32BIT; - case media_raw_audio_format::B_AUDIO_SHORT: - return B_FMT_16BIT; - case media_raw_audio_format::B_AUDIO_CHAR: - return B_FMT_8BIT_S; - case media_raw_audio_format::B_AUDIO_UCHAR: - return B_FMT_8BIT_U; - default: - return 0; - } -} - - -uint32 MultiAudioDevice::select_multiaudio_rate(uint32 rate) -{ - //highest rate - uint32 crate = B_SR_1536000; - while (crate != 0) { - if (rate & crate) - return crate; - crate >>= 1; - } - return 0; -} - - -uint32 MultiAudioDevice::select_multiaudio_format(uint32 fmt) -{ - //highest format - if (fmt & B_FMT_FLOAT) { - return B_FMT_FLOAT; - } else if (fmt & B_FMT_32BIT) { - return B_FMT_32BIT; - } else if (fmt & B_FMT_24BIT) { - return B_FMT_24BIT; - } else if (fmt & B_FMT_20BIT) { - return B_FMT_20BIT; - } else if (fmt & B_FMT_18BIT) { - return B_FMT_18BIT; - } else if (fmt & B_FMT_16BIT) { - return B_FMT_16BIT; - } else if (fmt & B_FMT_8BIT_S) { - return B_FMT_8BIT_S; - } else if (fmt & B_FMT_8BIT_U) { - return B_FMT_8BIT_U; - } else - return 0; -} - - - MultiAudioDevice::~MultiAudioDevice() { CALLED(); - if (fd != 0) { - close(fd); - } -} - -MultiAudioDevice::MultiAudioDevice(const char* name, const char* path) -{ - CALLED(); - fInitCheckStatus = B_NO_INIT; - - strcpy(fDevice_name, name); - strcpy(fDevice_path, path); - - PRINT(("name : %s, path : %s\n", fDevice_name, fDevice_path)); - - if (InitDriver() != B_OK) - return; - - fInitCheckStatus = B_OK; + if (fDevice >= 0) + close(fDevice); } -status_t MultiAudioDevice::InitCheck(void) const +status_t +MultiAudioDevice::InitCheck() const { CALLED(); - return fInitCheckStatus; + return fInitStatus; } -status_t MultiAudioDevice::InitDriver() +status_t +MultiAudioDevice::_InitDriver() { - multi_channel_enable MCE; - uint32 mce_enable_bits; - int rval, i, num_outputs, num_inputs, num_channels; + int num_outputs, num_inputs, num_channels; CALLED(); - //open the device driver for output - fd = open(fDevice_path, O_WRONLY); + // open the device driver - if (fd == -1) { - fprintf(stderr, "Failed to open %s: %s\n", fDevice_path, strerror(errno)); + fDevice = open(fPath, O_WRONLY); + if (fDevice == -1) { + fprintf(stderr, "Failed to open %s: %s\n", fPath, strerror(errno)); return B_ERROR; } - // // Get description - // - MD.info_size = sizeof(MD); - MD.request_channel_count = MAX_CHANNELS; - MD.channels = MCI; - rval = DRIVER_GET_DESCRIPTION(&MD, 0); - if (B_OK != rval) - { - fprintf(stderr, "Failed on B_MULTI_GET_DESCRIPTION\n"); - return B_ERROR; + + fDescription.info_size = sizeof(fDescription); + fDescription.request_channel_count = MAX_CHANNELS; + fDescription.channels = fChannelInfo; + status_t status = get_description(fDevice, &fDescription); + if (status != B_OK) { + fprintf(stderr, "Failed on B_MULTI_GET_DESCRIPTION: %s\n", + strerror(status)); + return status; } PRINT(("Friendly name:\t%s\nVendor:\t\t%s\n", - MD.friendly_name, MD.vendor_info)); + fDescription.friendly_name, fDescription.vendor_info)); PRINT(("%ld outputs\t%ld inputs\n%ld out busses\t%ld in busses\n", - MD.output_channel_count, MD.input_channel_count, - MD.output_bus_channel_count, MD.input_bus_channel_count)); + fDescription.output_channel_count, fDescription.input_channel_count, + fDescription.output_bus_channel_count, + fDescription.input_bus_channel_count)); PRINT(("\nChannels\n" "ID\tKind\tDesig\tConnectors\n")); - for (i = 0 ; i < (MD.output_channel_count + MD.input_channel_count); i++) - { - PRINT(("%ld\t%d\t0x%lx\t0x%lx\n", MD.channels[i].channel_id, - MD.channels[i].kind, - MD.channels[i].designations, - MD.channels[i].connectors)); + for (int32 i = 0; i < fDescription.output_channel_count + + fDescription.input_channel_count; i++) { + PRINT(("%ld\t%d\t0x%lx\t0x%lx\n", fDescription.channels[i].channel_id, + fDescription.channels[i].kind, + fDescription.channels[i].designations, + fDescription.channels[i].connectors)); } PRINT(("\n")); - PRINT(("Output rates\t\t0x%lx\n", MD.output_rates)); - PRINT(("Input rates\t\t0x%lx\n", MD.input_rates)); - PRINT(("Max CVSR\t\t%.0f\n", MD.max_cvsr_rate)); - PRINT(("Min CVSR\t\t%.0f\n", MD.min_cvsr_rate)); - PRINT(("Output formats\t\t0x%lx\n", MD.output_formats)); - PRINT(("Input formats\t\t0x%lx\n", MD.input_formats)); - PRINT(("Lock sources\t\t0x%lx\n", MD.lock_sources)); - PRINT(("Timecode sources\t0x%lx\n", MD.timecode_sources)); - PRINT(("Interface flags\t\t0x%lx\n", MD.interface_flags)); - PRINT(("Control panel string:\t\t%s\n", MD.control_panel)); + PRINT(("Output rates\t\t0x%lx\n", fDescription.output_rates)); + PRINT(("Input rates\t\t0x%lx\n", fDescription.input_rates)); + PRINT(("Max CVSR\t\t%.0f\n", fDescription.max_cvsr_rate)); + PRINT(("Min CVSR\t\t%.0f\n", fDescription.min_cvsr_rate)); + PRINT(("Output formats\t\t0x%lx\n", fDescription.output_formats)); + PRINT(("Input formats\t\t0x%lx\n", fDescription.input_formats)); + PRINT(("Lock sources\t\t0x%lx\n", fDescription.lock_sources)); + PRINT(("Timecode sources\t0x%lx\n", fDescription.timecode_sources)); + PRINT(("Interface flags\t\t0x%lx\n", fDescription.interface_flags)); + PRINT(("Control panel string:\t\t%s\n", fDescription.control_panel)); PRINT(("\n")); - num_outputs = MD.output_channel_count; - num_inputs = MD.input_channel_count; + num_outputs = fDescription.output_channel_count; + num_inputs = fDescription.input_channel_count; num_channels = num_outputs + num_inputs; // Get and set enabled channels - MCE.info_size = sizeof(MCE); - MCE.enable_bits = (uchar *) & mce_enable_bits; - rval = DRIVER_GET_ENABLED_CHANNELS(&MCE, sizeof(MCE)); - if (B_OK != rval) - { - fprintf(stderr, "Failed on B_MULTI_GET_ENABLED_CHANNELS len is 0x%lx\n", sizeof(MCE)); - return B_ERROR; + + multi_channel_enable enable; + uint32 enableBits; + enable.info_size = sizeof(enable); + enable.enable_bits = (uchar*)&enableBits; + + status = get_enabled_channels(fDevice, &enable); + if (status != B_OK) { + fprintf(stderr, "Failed on B_MULTI_GET_ENABLED_CHANNELS: %s\n", + strerror(status)); + return status; } - mce_enable_bits = (1 << num_channels) - 1; - MCE.lock_source = B_MULTI_LOCK_INTERNAL; - rval = DRIVER_SET_ENABLED_CHANNELS(&MCE, 0); - if (B_OK != rval) - { - fprintf(stderr, "Failed on B_MULTI_SET_ENABLED_CHANNELS 0x%p 0x%x\n", MCE.enable_bits, *(MCE.enable_bits)); - return B_ERROR; + enableBits = (1 << num_channels) - 1; + enable.lock_source = B_MULTI_LOCK_INTERNAL; + + status = set_enabled_channels(fDevice, &enable); + if (status != B_OK) { + fprintf(stderr, "Failed on B_MULTI_SET_ENABLED_CHANNELS 0x%x: %s\n", + *enable.enable_bits, strerror(status)); + return status; } - // // Set the sample rate - // - MFI.info_size = sizeof(MFI); - MFI.output.rate = select_multiaudio_rate(MD.output_rates); - MFI.output.cvsr = 0; - MFI.output.format = select_multiaudio_format(MD.output_formats); - MFI.input.rate = MFI.output.rate; - MFI.input.cvsr = MFI.output.cvsr; - MFI.input.format = MFI.output.format; - rval = DRIVER_SET_GLOBAL_FORMAT(&MFI, 0); - if (B_OK != rval) - { - fprintf(stderr, "Failed on B_MULTI_SET_GLOBAL_FORMAT\n"); - return B_ERROR; + + fFormatInfo.info_size = sizeof(multi_format_info); + fFormatInfo.output.rate = select_sample_rate(fDescription.output_rates); + fFormatInfo.output.cvsr = 0; + fFormatInfo.output.format = select_format(fDescription.output_formats); + fFormatInfo.input.rate = select_sample_rate(fDescription.input_rates); + fFormatInfo.input.cvsr = fFormatInfo.output.cvsr; + fFormatInfo.input.format = select_format(fDescription.input_formats); + + status = set_global_format(fDevice, &fFormatInfo); + if (status != B_OK) { + fprintf(stderr, "Failed on B_MULTI_SET_GLOBAL_FORMAT: %s\n", + strerror(status)); +#if 0 + } + + status = get_global_format(fDevice, &fFormatInfo); + if (status != B_OK) { + fprintf(stderr, "Failed on B_MULTI_GET_GLOBAL_FORMAT: %s\n", + strerror(status)); +#endif + return status; } - // // Get the buffers - // - for (i = 0; i < NB_BUFFERS; i++) { - play_buffer_desc[i] = &play_buffer_list[i * MAX_CHANNELS]; - record_buffer_desc[i] = &record_buffer_list[i * MAX_CHANNELS]; + + for (uint32 i = 0; i < MAX_BUFFERS; i++) { + fPlayBuffers[i] = &fPlayBufferList[i * MAX_CHANNELS]; + fRecordBuffers[i] = &fRecordBufferList[i * MAX_CHANNELS]; } - MBL.info_size = sizeof(MBL); - MBL.request_playback_buffer_size = 0; //use the default...... - MBL.request_playback_buffers = NB_BUFFERS; - MBL.request_playback_channels = num_outputs; - MBL.playback_buffers = (buffer_desc **) play_buffer_desc; - MBL.request_record_buffer_size = 0; //use the default...... - MBL.request_record_buffers = NB_BUFFERS; - MBL.request_record_channels = num_inputs; - MBL.record_buffers = (buffer_desc **) record_buffer_desc; + fBufferList.info_size = sizeof(multi_buffer_list); + fBufferList.request_playback_buffer_size = 0; + // use the default... + fBufferList.request_playback_buffers = MAX_BUFFERS; + fBufferList.request_playback_channels = num_outputs; + fBufferList.playback_buffers = (buffer_desc **) fPlayBuffers; + fBufferList.request_record_buffer_size = 0; + // use the default... + fBufferList.request_record_buffers = MAX_BUFFERS; + fBufferList.request_record_channels = num_inputs; + fBufferList.record_buffers = /*(buffer_desc **)*/ fRecordBuffers; - rval = DRIVER_GET_BUFFERS(&MBL, 0); - - if (B_OK != rval) - { - fprintf(stderr, "Failed on B_MULTI_GET_BUFFERS\n"); - return B_ERROR; + status = get_buffers(fDevice, &fBufferList); + if (status != B_OK) { + fprintf(stderr, "Failed on B_MULTI_GET_BUFFERS: %s\n", + strerror(status)); + return status; } - for (i = 0; i < MBL.return_playback_buffers; i++) - for (int j = 0; j < MBL.return_playback_channels; j++) { - PRINT(("MBL.playback_buffers[%d][%d].base: %p\n", - i, j, MBL.playback_buffers[i][j].base)); - PRINT(("MBL.playback_buffers[%d][%d].stride: %i\n", - i, j, MBL.playback_buffers[i][j].stride)); + for (int32 i = 0; i < fBufferList.return_playback_buffers; i++) { + for (int32 j = 0; j < fBufferList.return_playback_channels; j++) { + PRINT(("fBufferList.playback_buffers[%d][%d].base: %p\n", + i, j, fBufferList.playback_buffers[i][j].base)); + PRINT(("fBufferList.playback_buffers[%d][%d].stride: %i\n", + i, j, fBufferList.playback_buffers[i][j].stride)); } + } - for (i = 0; i < MBL.return_record_buffers; i++) - for (int j = 0; j < MBL.return_record_channels; j++) { - PRINT(("MBL.record_buffers[%d][%d].base: %p\n", - i, j, MBL.record_buffers[i][j].base)); - PRINT(("MBL.record_buffers[%d][%d].stride: %i\n", - i, j, MBL.record_buffers[i][j].stride)); + for (int32 i = 0; i < fBufferList.return_record_buffers; i++) { + for (int32 j = 0; j < fBufferList.return_record_channels; j++) { + PRINT(("fBufferList.record_buffers[%d][%d].base: %p\n", + i, j, fBufferList.record_buffers[i][j].base)); + PRINT(("fBufferList.record_buffers[%d][%d].stride: %i\n", + i, j, fBufferList.record_buffers[i][j].stride)); } + } - MMCI.info_size = sizeof(MMCI); - MMCI.control_count = MAX_CONTROLS; - MMCI.controls = MMC; + fMixControlInfo.info_size = sizeof(fMixControlInfo); + fMixControlInfo.control_count = MAX_CONTROLS; + fMixControlInfo.controls = fMixControl; - rval = DRIVER_LIST_MIX_CONTROLS(&MMCI, 0); - - if (B_OK != rval) - { - fprintf(stderr, "Failed on DRIVER_LIST_MIX_CONTROLS\n"); - return B_ERROR; + status = list_mix_controls(fDevice, &fMixControlInfo); + if (status != B_OK) { + fprintf(stderr, "Failed on DRIVER_LIST_MIX_CONTROLS: %s\n", + strerror(status)); + return status; } return B_OK; } -int -MultiAudioDevice::DoBufferExchange(multi_buffer_info *MBI) + +status_t +MultiAudioDevice::DoBufferExchange(multi_buffer_info *info) { - return DRIVER_BUFFER_EXCHANGE(MBI, 0); + return buffer_exchange(fDevice, info); } -int -MultiAudioDevice::DoSetMix(multi_mix_value_info *MMVI) + +status_t +MultiAudioDevice::DoSetMix(multi_mix_value_info *info) { - return DRIVER_SET_MIX(MMVI, 0); + return set_mix(fDevice, info); } -int -MultiAudioDevice::DoGetMix(multi_mix_value_info *MMVI) + +status_t +MultiAudioDevice::DoGetMix(multi_mix_value_info *info) { - return DRIVER_GET_MIX(MMVI, 0); + return get_mix(fDevice, info); } 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 833528d347..5a6b00c6f3 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 @@ -2,59 +2,54 @@ * Copyright (c) 2002-2007, Jerome Duval (jerome.duval@free.fr) * Distributed under the terms of the MIT License. */ +#ifndef MULTI_AUDIO_DEVICE_H +#define MULTI_AUDIO_DEVICE_H -#ifndef _MULTIAUDIODEVICE_H -#define _MULTIAUDIODEVICE_H #include "hmulti_audio.h" + #define MAX_CONTROLS 128 #define MAX_CHANNELS 32 -#define NB_BUFFERS 32 +#define MAX_BUFFERS 32 -class MultiAudioDevice -{ - public: - explicit MultiAudioDevice(const char *name, const char* path); - virtual ~MultiAudioDevice(void); - virtual status_t InitCheck(void) const; +class MultiAudioDevice { +public: + MultiAudioDevice(const char* name, const char* path); + ~MultiAudioDevice(); - 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); + status_t InitCheck() const; - int DoBufferExchange(multi_buffer_info *MBI); - int DoSetMix(multi_mix_value_info *MMVI); - int DoGetMix(multi_mix_value_info *MMVI); + const multi_description& Description() const { return fDescription; } + const multi_format_info& FormatInfo() const { return fFormatInfo; } + const multi_buffer_list& BufferList() const { return fBufferList; } + const multi_mix_control_info& MixControlInfo() const + { return fMixControlInfo; } - private: - status_t InitDriver(); + status_t DoBufferExchange(multi_buffer_info* bufferInfo); + status_t DoSetMix(multi_mix_value_info* mixValueInfo); + status_t DoGetMix(multi_mix_value_info* mixValueInfo); - int fd; //file descriptor for hw driver - char fDevice_name[32]; - char fDevice_path[32]; +private: + status_t _InitDriver(); - public: - multi_description MD; - multi_channel_info MCI[MAX_CHANNELS]; - multi_format_info MFI; - multi_buffer_list MBL; + status_t fInitStatus; + int fDevice; + char fPath[B_PATH_NAME_LENGTH]; - multi_mix_control_info MMCI; - multi_mix_control MMC[MAX_CONTROLS]; + multi_description fDescription; + multi_channel_info fChannelInfo[MAX_CHANNELS]; + multi_format_info fFormatInfo; + multi_buffer_list fBufferList; - buffer_desc play_buffer_list[NB_BUFFERS * MAX_CHANNELS]; - buffer_desc record_buffer_list[NB_BUFFERS * MAX_CHANNELS]; - buffer_desc *play_buffer_desc[NB_BUFFERS]; - buffer_desc *record_buffer_desc[NB_BUFFERS]; + multi_mix_control_info fMixControlInfo; + multi_mix_control fMixControl[MAX_CONTROLS]; - private: - status_t fInitCheckStatus; + buffer_desc fPlayBufferList[MAX_BUFFERS * MAX_CHANNELS]; + buffer_desc fRecordBufferList[MAX_BUFFERS * MAX_CHANNELS]; + buffer_desc* fPlayBuffers[MAX_BUFFERS]; + buffer_desc* fRecordBuffers[MAX_BUFFERS]; }; -#endif +#endif // MULTI_AUDIO_DEVICE_H 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 7d1f1d9175..dd53fa17eb 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 @@ -4,6 +4,8 @@ * Copyright (c) 2002, 2003 Jerome Duval (jerome.duval@free.fr) * Distributed under the terms of the MIT License. */ + + #include #include #include @@ -23,18 +25,17 @@ #include #include +#include "MultiAudioUtility.h" #include "MultiAudioNode.h" -#include "driver_io.h" #ifdef DEBUG - #define PRINTING +# define PRINTING #endif #include "debug.h" #include #include -const char * multi_string[] = -{ +const char * multi_string[] = { "NAME IS ATTACHED", "Output", "Input", "Setup", "Tone Control", "Extended Setup", "Enhanced Setup", "Master", "Beep", "Phone", "Mic", "Line", "CD", "Video", "Aux", "Wave", "Gain", "Level", "Volume", @@ -42,6 +43,7 @@ const char * multi_string[] = "Output Treble", "Output 3D Center", "Output 3D Depth" }; + node_input::node_input(media_input &input, media_format format) { CALLED(); @@ -72,11 +74,51 @@ node_output::~node_output() } -// -------------------------------------------------------- // -// ctor/dtor -// -------------------------------------------------------- // +MultiAudioNode::MultiAudioNode(BMediaAddOn* addon, const char* name, + MultiAudioDevice* device, int32 internalID, BMessage* config) + : BMediaNode(name), BBufferConsumer(B_MEDIA_RAW_AUDIO), + BBufferProducer(B_MEDIA_RAW_AUDIO), + fThread(-1), + fDevice(device), + fTimeSourceStarted(false), + fWeb(NULL), + fConfig(*config) +{ + CALLED(); + fInitCheckStatus = B_NO_INIT; -MultiAudioNode::~MultiAudioNode(void) + if (!device) + return; + + fAddOn = addon; + fId = internalID; + + AddNodeKind(B_PHYSICAL_OUTPUT); + AddNodeKind(B_PHYSICAL_INPUT); + + // initialize our preferred format object + memset(&fPreferredFormat, 0, sizeof(fPreferredFormat)); // set everything to wildcard first + fPreferredFormat.type = B_MEDIA_RAW_AUDIO; + fPreferredFormat.u.raw_audio.format = MultiAudio::convert_to_media_format(fDevice->FormatInfo().output.format); + fPreferredFormat.u.raw_audio.valid_bits = MultiAudio::convert_to_valid_bits(fDevice->FormatInfo().output.format); + fPreferredFormat.u.raw_audio.channel_count = 2; + fPreferredFormat.u.raw_audio.frame_rate = MultiAudio::convert_to_sample_rate(fDevice->FormatInfo().input.rate); // measured in Hertz + fPreferredFormat.u.raw_audio.byte_order = B_MEDIA_HOST_ENDIAN; + + // we'll use the consumer's preferred buffer size, if any + fPreferredFormat.u.raw_audio.buffer_size = fDevice->BufferList().return_record_buffer_size + * (fPreferredFormat.u.raw_audio.format & media_raw_audio_format::B_AUDIO_SIZE_MASK) + * fPreferredFormat.u.raw_audio.channel_count; + + if (config) { + PRINT_OBJECT(*config); + } + + fInitCheckStatus = B_OK; +} + + +MultiAudioNode::~MultiAudioNode() { CALLED(); fAddOn->GetConfigurationFor(this, NULL); @@ -87,53 +129,9 @@ MultiAudioNode::~MultiAudioNode(void) fWeb = NULL; } -MultiAudioNode::MultiAudioNode(BMediaAddOn *addon, char* name, MultiAudioDevice *device, - int32 internal_id, BMessage * config) - : BMediaNode(name), - BBufferConsumer(B_MEDIA_RAW_AUDIO), - BBufferProducer(B_MEDIA_RAW_AUDIO), - BTimeSource(), - BMediaEventLooper(), - fThread(-1), - fDevice(device), - fTimeSourceStarted(false), - fWeb(NULL), - fConfig(*config) -{ - CALLED(); - fInitCheckStatus = B_NO_INIT; - - if(!device) - return; - - fAddOn = addon; - fId = internal_id; - - AddNodeKind( B_PHYSICAL_OUTPUT ); - AddNodeKind( B_PHYSICAL_INPUT ); - - // initialize our preferred format object - 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; - - // we'll use the consumer's preferred buffer size, if any - fPreferredFormat.u.raw_audio.buffer_size = fDevice->MBL.return_record_buffer_size - * (fPreferredFormat.u.raw_audio.format & media_raw_audio_format::B_AUDIO_SIZE_MASK) - * fPreferredFormat.u.raw_audio.channel_count; - - if(config) { - PRINT_OBJECT(*config); - } - - fInitCheckStatus = B_OK; -} -status_t MultiAudioNode::InitCheck(void) const +status_t +MultiAudioNode::InitCheck() const { CALLED(); return fInitCheckStatus; @@ -144,69 +142,67 @@ status_t MultiAudioNode::InitCheck(void) const // implementation of BMediaNode // -------------------------------------------------------- // -BMediaAddOn * MultiAudioNode::AddOn( - int32 * internal_id) const +BMediaAddOn* +MultiAudioNode::AddOn(int32* _internalID) const { CALLED(); // BeBook says this only gets called if we were in an add-on. - if (fAddOn != 0) { - // If we get a null pointer then we just won't write. - if (internal_id != 0) { - *internal_id = fId; - } - } + if (fAddOn != 0 && _internalID != NULL) + *_internalID = fId; + return fAddOn; } -void MultiAudioNode::Preroll(void) + +void +MultiAudioNode::Preroll() { CALLED(); // XXX:Performance opportunity BMediaNode::Preroll(); } -status_t MultiAudioNode::HandleMessage( - int32 message, - const void * data, - size_t size) + +status_t +MultiAudioNode::HandleMessage(int32 message, const void* data, size_t size) { CALLED(); return B_ERROR; } -void MultiAudioNode::NodeRegistered(void) + +void +MultiAudioNode::NodeRegistered() { CALLED(); - + if (fInitCheckStatus != B_OK) { ReportError(B_NODE_IN_DISTRESS); return; } - + SetPriority(B_REAL_TIME_PRIORITY); - Run(); - + node_input *currentInput = NULL; int32 currentId = 0; - - for (int32 i = 0; i < fDevice->MD.output_channel_count; i++) { - - if( (currentInput == NULL) - || (fDevice->MD.channels[i].designations & B_CHANNEL_MONO_BUS) - || (fDevice->MD.channels[currentId].designations & B_CHANNEL_STEREO_BUS - && ( fDevice->MD.channels[i].designations & B_CHANNEL_LEFT || - !(fDevice->MD.channels[i].designations & B_CHANNEL_STEREO_BUS))) - || (fDevice->MD.channels[currentId].designations & B_CHANNEL_SURROUND_BUS - && ( fDevice->MD.channels[i].designations & B_CHANNEL_LEFT || - !(fDevice->MD.channels[i].designations & B_CHANNEL_SURROUND_BUS))) + + for (int32 i = 0; i < fDevice->Description().output_channel_count; i++) { + if (currentInput == NULL + || (fDevice->Description().channels[i].designations & B_CHANNEL_MONO_BUS) + || (fDevice->Description().channels[currentId].designations & B_CHANNEL_STEREO_BUS + && ( fDevice->Description().channels[i].designations & B_CHANNEL_LEFT || + !(fDevice->Description().channels[i].designations & B_CHANNEL_STEREO_BUS))) + || (fDevice->Description().channels[currentId].designations & B_CHANNEL_SURROUND_BUS + && ( fDevice->Description().channels[i].designations & B_CHANNEL_LEFT || + !(fDevice->Description().channels[i].designations & B_CHANNEL_SURROUND_BUS))) ) { PRINT(("NodeRegistered() : creating an input for %i\n", i)); - PRINT(("%ld\t%d\t0x%lx\t0x%lx\n",fDevice->MD.channels[i].channel_id, - fDevice->MD.channels[i].kind, - fDevice->MD.channels[i].designations, - fDevice->MD.channels[i].connectors)); - + PRINT(("%ld\t%d\t0x%lx\t0x%lx\n",fDevice->Description().channels[i].channel_id, + fDevice->Description().channels[i].kind, + fDevice->Description().channels[i].designations, + fDevice->Description().channels[i].connectors)); + media_input *input = new media_input; input->format = fPreferredFormat; @@ -214,16 +210,15 @@ void MultiAudioNode::NodeRegistered(void) input->destination.id = fInputs.CountItems(); input->node = Node(); sprintf(input->name, "output %ld", input->destination.id); - + currentInput = new node_input(*input, fPreferredFormat); currentInput->fPreferredFormat.u.raw_audio.channel_count = 1; currentInput->fInput.format = currentInput->fPreferredFormat; - - currentInput->fChannelId = fDevice->MD.channels[i].channel_id; + + currentInput->fChannelId = fDevice->Description().channels[i].channel_id; fInputs.AddItem(currentInput); - + currentId = i; - } else { PRINT(("NodeRegistered() : adding a channel\n")); currentInput->fPreferredFormat.u.raw_audio.channel_count++; @@ -231,27 +226,27 @@ void MultiAudioNode::NodeRegistered(void) } currentInput->fInput.format.u.raw_audio.format = media_raw_audio_format::wildcard.format; } - + node_output *currentOutput = NULL; currentId = 0; - - for (int32 i = fDevice->MD.output_channel_count; - i < (fDevice->MD.output_channel_count + fDevice->MD.input_channel_count); i++) { - - if( (currentOutput == NULL) - || (fDevice->MD.channels[i].designations & B_CHANNEL_MONO_BUS) - || (fDevice->MD.channels[currentId].designations & B_CHANNEL_STEREO_BUS - && ( fDevice->MD.channels[i].designations & B_CHANNEL_LEFT || - !(fDevice->MD.channels[i].designations & B_CHANNEL_STEREO_BUS))) - || (fDevice->MD.channels[currentId].designations & B_CHANNEL_SURROUND_BUS - && ( fDevice->MD.channels[i].designations & B_CHANNEL_LEFT || - !(fDevice->MD.channels[i].designations & B_CHANNEL_SURROUND_BUS))) + + for (int32 i = fDevice->Description().output_channel_count; + i < (fDevice->Description().output_channel_count + fDevice->Description().input_channel_count); i++) { + + if (currentOutput == NULL + || (fDevice->Description().channels[i].designations & B_CHANNEL_MONO_BUS) + || (fDevice->Description().channels[currentId].designations & B_CHANNEL_STEREO_BUS + && ( fDevice->Description().channels[i].designations & B_CHANNEL_LEFT || + !(fDevice->Description().channels[i].designations & B_CHANNEL_STEREO_BUS))) + || (fDevice->Description().channels[currentId].designations & B_CHANNEL_SURROUND_BUS + && ( fDevice->Description().channels[i].designations & B_CHANNEL_LEFT || + !(fDevice->Description().channels[i].designations & B_CHANNEL_SURROUND_BUS))) ) { PRINT(("NodeRegistered() : creating an output for %i\n", i)); - PRINT(("%ld\t%d\t0x%lx\t0x%lx\n",fDevice->MD.channels[i].channel_id, - fDevice->MD.channels[i].kind, - fDevice->MD.channels[i].designations, - fDevice->MD.channels[i].connectors)); + PRINT(("%ld\t%d\t0x%lx\t0x%lx\n",fDevice->Description().channels[i].channel_id, + fDevice->Description().channels[i].kind, + fDevice->Description().channels[i].designations, + fDevice->Description().channels[i].connectors)); media_output *output = new media_output; @@ -261,78 +256,79 @@ void MultiAudioNode::NodeRegistered(void) output->source.id = fOutputs.CountItems(); output->node = Node(); sprintf(output->name, "input %ld", output->source.id); - + currentOutput = new node_output(*output, fPreferredFormat); currentOutput->fPreferredFormat.u.raw_audio.channel_count = 1; currentOutput->fOutput.format = currentOutput->fPreferredFormat; - currentOutput->fChannelId = fDevice->MD.channels[i].channel_id; + currentOutput->fChannelId = fDevice->Description().channels[i].channel_id; fOutputs.AddItem(currentOutput); - + currentId = i; - } else { PRINT(("NodeRegistered() : adding a channel\n")); currentOutput->fPreferredFormat.u.raw_audio.channel_count++; currentOutput->fOutput.format = currentOutput->fPreferredFormat; } } - + // Set up our parameter web fWeb = MakeParameterWeb(); SetParameterWeb(fWeb); - + /* apply configuration */ #ifdef PRINTING bigtime_t start = system_time(); #endif - + int32 index = 0; int32 parameterID = 0; const void *data; ssize_t size; - while(fConfig.FindInt32("parameterID", index, ¶meterID) == B_OK) { + while (fConfig.FindInt32("parameterID", index, ¶meterID) == B_OK) { if(fConfig.FindData("parameterData", B_RAW_TYPE, index, &data, &size) == B_OK) SetParameterValue(parameterID, TimeSource()->Now(), data, size); index++; } - + PRINT(("apply configuration in : %ld\n", system_time() - start)); } -status_t MultiAudioNode::RequestCompleted(const media_request_info &info) + +status_t +MultiAudioNode::RequestCompleted(const media_request_info& info) { CALLED(); return B_OK; } -void MultiAudioNode::SetTimeSource(BTimeSource *timeSource) + +void +MultiAudioNode::SetTimeSource(BTimeSource* timeSource) { CALLED(); } -// -------------------------------------------------------- // -// implemention of BBufferConsumer -// -------------------------------------------------------- // + +// #pragma mark - BBufferConsumer + // Check to make sure the format is okay, then remove // any wildcards corresponding to our requirements. -status_t MultiAudioNode::AcceptFormat( - const media_destination & dest, - media_format * format) +status_t +MultiAudioNode::AcceptFormat(const media_destination& dest, + media_format* format) { CALLED(); - + + if (format == NULL) + return B_BAD_VALUE; + if (format->type != B_MEDIA_RAW_AUDIO) + return B_MEDIA_BAD_FORMAT; + node_input *channel = FindInput(dest); - - if(channel==NULL) { - fprintf(stderr,"<- B_MEDIA_BAD_DESTINATION"); - return B_MEDIA_BAD_DESTINATION; // we only have one input so that better be it - } - - if (format == 0) { - fprintf(stderr,"<- B_BAD_VALUE\n"); - return B_BAD_VALUE; // no crashing - } + if (channel == NULL) + return B_MEDIA_BAD_DESTINATION; + /* media_format * myFormat = GetFormat(); fprintf(stderr,"proposed format: "); print_media_format(format); @@ -342,29 +338,23 @@ status_t MultiAudioNode::AcceptFormat( fprintf(stderr,"\n");*/ // Be's format_is_compatible doesn't work. // if (!format_is_compatible(*format,*myFormat)) { - - if ( format->type != B_MEDIA_RAW_AUDIO ) { - fprintf(stderr,"<- B_MEDIA_BAD_FORMAT\n"); - return B_MEDIA_BAD_FORMAT; - } - + channel->fFormat = channel->fPreferredFormat; - + /*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; 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; 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 - * (format->u.raw_audio.format & media_raw_audio_format::B_AUDIO_SIZE_MASK) - * format->u.raw_audio.channel_count; - - + format->u.raw_audio.buffer_size = fDevice->BufferList().return_playback_buffer_size + * (format->u.raw_audio.format & media_raw_audio_format::B_AUDIO_SIZE_MASK) + * format->u.raw_audio.channel_count; + /*media_format myFormat; GetFormat(&myFormat); if (!format_is_acceptible(*format,myFormat)) { @@ -375,37 +365,35 @@ status_t MultiAudioNode::AcceptFormat( return B_OK; } -status_t MultiAudioNode::GetNextInput( - int32 * cookie, - media_input * out_input) + +status_t +MultiAudioNode::GetNextInput(int32* cookie, media_input* _input) { CALLED(); - // let's not crash even if they are stupid - if (out_input == 0) { - // no place to write! - fprintf(stderr,"<- B_BAD_VALUE\n"); + if (_input == NULL) return B_BAD_VALUE; - } - - if ((*cookie < fInputs.CountItems()) && (*cookie >= 0)) { - node_input *channel = (node_input *)fInputs.ItemAt(*cookie); - *out_input = channel->fInput; - *cookie += 1; - PRINT(("input.format : %u\n", channel->fInput.format.u.raw_audio.format)); - return B_OK; - } else + + if (*cookie >= fInputs.CountItems() || *cookie < 0) return B_BAD_INDEX; + + node_input *channel = (node_input *)fInputs.ItemAt(*cookie); + *_input = channel->fInput; + *cookie += 1; + PRINT(("input.format : %u\n", channel->fInput.format.u.raw_audio.format)); + return B_OK; } -void MultiAudioNode::DisposeInputCookie( - int32 cookie) + +void +MultiAudioNode::DisposeInputCookie(int32 cookie) { CALLED(); // nothing to do since our cookies are just integers } -void MultiAudioNode::BufferReceived( - BBuffer * buffer) + +void +MultiAudioNode::BufferReceived(BBuffer* buffer) { //CALLED(); switch (buffer->Header()->type) { @@ -440,52 +428,47 @@ void MultiAudioNode::BufferReceived( } } -void MultiAudioNode::ProducerDataStatus( - const media_destination & for_whom, - int32 status, - bigtime_t at_performance_time) + +void +MultiAudioNode::ProducerDataStatus(const media_destination& forWhom, + int32 status, bigtime_t atPerformanceTime) { //CALLED(); - - node_input *channel = FindInput(for_whom); - - if(channel==NULL) { + + node_input *channel = FindInput(forWhom); + if (channel == NULL) { fprintf(stderr,"invalid destination received in MultiAudioNode::ProducerDataStatus\n"); return; } - - media_timed_event event(at_performance_time, BTimedEventQueue::B_DATA_STATUS, - &channel->fInput, BTimedEventQueue::B_NO_CLEANUP, status, 0, NULL); + + media_timed_event event(atPerformanceTime, BTimedEventQueue::B_DATA_STATUS, + &channel->fInput, BTimedEventQueue::B_NO_CLEANUP, status, 0, NULL); EventQueue()->AddEvent(event); } -status_t MultiAudioNode::GetLatencyFor( - const media_destination & for_whom, - bigtime_t * out_latency, - media_node_id * out_timesource) + +status_t +MultiAudioNode::GetLatencyFor(const media_destination& forWhom, + bigtime_t* _latency, media_node_id* _timeSource) { CALLED(); - if ((out_latency == 0) || (out_timesource == 0)) { - fprintf(stderr,"<- B_BAD_VALUE\n"); + if (_latency == NULL || _timeSource == NULL) return B_BAD_VALUE; - } - - node_input *channel = FindInput(for_whom); - - if(channel==NULL) { - fprintf(stderr,"<- B_MEDIA_BAD_DESTINATION\n"); + + node_input *channel = FindInput(forWhom); + if (channel == NULL) return B_MEDIA_BAD_DESTINATION; - } - *out_latency = EventLatency(); - *out_timesource = TimeSource()->ID(); + + *_latency = EventLatency(); + *_timeSource = TimeSource()->ID(); return B_OK; } -status_t MultiAudioNode::Connected( - const media_source & producer, /* here's a good place to request buffer group usage */ - const media_destination & where, - const media_format & with_format, - media_input * out_input) + +status_t +MultiAudioNode::Connected(const media_source& producer, + const media_destination& where, const media_format& with_format, + media_input* out_input) { CALLED(); if (out_input == 0) { @@ -502,10 +485,10 @@ status_t MultiAudioNode::Connected( // use one buffer length latency fInternalLatency = with_format.u.raw_audio.buffer_size * 10000 / 2 - / ( (with_format.u.raw_audio.format & media_raw_audio_format::B_AUDIO_SIZE_MASK) - * with_format.u.raw_audio.channel_count) - / ((int32)(with_format.u.raw_audio.frame_rate / 100)); - + / ( (with_format.u.raw_audio.format & media_raw_audio_format::B_AUDIO_SIZE_MASK) + * with_format.u.raw_audio.channel_count) + / ((int32)(with_format.u.raw_audio.frame_rate / 100)); + PRINT((" internal latency = %lld\n",fInternalLatency)); SetEventLatency(fInternalLatency); @@ -521,9 +504,10 @@ status_t MultiAudioNode::Connected( return B_OK; } -void MultiAudioNode::Disconnected( - const media_source & producer, - const media_destination & where) + +void +MultiAudioNode::Disconnected(const media_source& producer, + const media_destination& where) { CALLED(); node_input *channel = FindInput(where); @@ -543,13 +527,11 @@ void MultiAudioNode::Disconnected( //GetFormat(&channel->fInput.format); } - /* The notification comes from the upstream producer, so he's already cool with */ - /* the format; you should not ask him about it in here. */ -status_t MultiAudioNode::FormatChanged( - const media_source & producer, - const media_destination & consumer, - int32 change_tag, - const media_format & format) + +status_t +MultiAudioNode::FormatChanged(const media_source& producer, + const media_destination& consumer, int32 change_tag, + const media_format& format) { CALLED(); node_input *channel = FindInput(consumer); @@ -565,12 +547,9 @@ status_t MultiAudioNode::FormatChanged( return B_ERROR; } - /* Given a performance time of some previous buffer, retrieve the remembered tag */ - /* of the closest (previous or exact) performance time. Set *out_flags to 0; the */ - /* idea being that flags can be added later, and the understood flags returned in */ - /* *out_flags. */ -status_t MultiAudioNode::SeekTagRequested( - const media_destination & destination, + +status_t +MultiAudioNode::SeekTagRequested(const media_destination& destination, bigtime_t in_target_time, uint32 in_flags, media_seek_tag * out_seek_tag, @@ -582,12 +561,13 @@ status_t MultiAudioNode::SeekTagRequested( out_seek_tag,out_tagged_time,out_flags); } -// -------------------------------------------------------- // -// implementation for BBufferProducer -// -------------------------------------------------------- // + +// #pragma mark - BBufferProducer + status_t -MultiAudioNode::FormatSuggestionRequested(media_type type, int32 /*quality*/, media_format* format) +MultiAudioNode::FormatSuggestionRequested(media_type type, int32 /*quality*/, + media_format* format) { // FormatSuggestionRequested() is not necessarily part of the format negotiation // process; it's simply an interrogation -- the caller wants to see what the node's @@ -611,7 +591,8 @@ MultiAudioNode::FormatSuggestionRequested(media_type type, int32 /*quality*/, me else return B_OK; } -status_t + +status_t MultiAudioNode::FormatProposal(const media_source& output, media_format* format) { // FormatProposal() is the first stage in the BMediaRoster::Connect() process. We hand @@ -638,8 +619,11 @@ MultiAudioNode::FormatProposal(const media_source& output, media_format* format) else return B_OK; // raw audio or wildcard type, either is okay by us } -status_t -MultiAudioNode::FormatChangeRequested(const media_source& source, const media_destination& destination, media_format* io_format, int32* _deprecated_) + +status_t +MultiAudioNode::FormatChangeRequested(const media_source& source, + const media_destination& destination, media_format* format, + int32* _deprecated_) { CALLED(); @@ -647,7 +631,8 @@ MultiAudioNode::FormatChangeRequested(const media_source& source, const media_de return B_ERROR; } -status_t + +status_t MultiAudioNode::GetNextOutput(int32* cookie, media_output* out_output) { CALLED(); @@ -661,7 +646,8 @@ MultiAudioNode::GetNextOutput(int32* cookie, media_output* out_output) return B_BAD_INDEX; } -status_t + +status_t MultiAudioNode::DisposeOutputCookie(int32 cookie) { CALLED(); @@ -669,8 +655,10 @@ MultiAudioNode::DisposeOutputCookie(int32 cookie) return B_OK; } -status_t -MultiAudioNode::SetBufferGroup(const media_source& for_source, BBufferGroup* newGroup) + +status_t +MultiAudioNode::SetBufferGroup(const media_source& for_source, + BBufferGroup* newGroup) { CALLED(); @@ -710,7 +698,8 @@ MultiAudioNode::SetBufferGroup(const media_source& for_source, BBufferGroup* new return B_OK; } -status_t + +status_t MultiAudioNode::PrepareToConnect(const media_source& what, const media_destination& where, media_format* format, media_source* out_source, char* out_name) { // PrepareToConnect() is the second stage of format negotiations that happens @@ -764,7 +753,8 @@ MultiAudioNode::PrepareToConnect(const media_source& what, const media_destinati return B_OK; } -void + +void MultiAudioNode::Connect(status_t error, const media_source& source, const media_destination& destination, const media_format& format, char* io_name) { CALLED(); @@ -823,7 +813,8 @@ MultiAudioNode::Connect(status_t error, const media_source& source, const media_ StartThread(); } -void + +void MultiAudioNode::Disconnect(const media_source& what, const media_destination& where) { CALLED(); @@ -852,7 +843,8 @@ MultiAudioNode::Disconnect(const media_source& what, const media_destination& wh } } -void + +void MultiAudioNode::LateNoticeReceived(const media_source& what, bigtime_t how_much, bigtime_t performance_time) { CALLED(); @@ -898,7 +890,8 @@ MultiAudioNode::LateNoticeReceived(const media_source& what, bigtime_t how_much, } } -void + +void MultiAudioNode::EnableOutput(const media_source& what, bool enabled, int32* _deprecated_) { CALLED(); @@ -915,7 +908,8 @@ MultiAudioNode::EnableOutput(const media_source& what, bool enabled, int32* _dep } } -void + +void MultiAudioNode::AdditionalBufferRequested(const media_source& source, media_buffer_id prev_buffer, bigtime_t prev_time, const media_seek_tag* prev_tag) { CALLED(); @@ -923,14 +917,13 @@ MultiAudioNode::AdditionalBufferRequested(const media_source& source, media_buff return; } -// -------------------------------------------------------- // -// implementation for BMediaEventLooper -// -------------------------------------------------------- // -void MultiAudioNode::HandleEvent( - const media_timed_event *event, - bigtime_t lateness, - bool realTimeEvent) +// #pragma mark - BMediaEventLooper + + +void +MultiAudioNode::HandleEvent(const media_timed_event* event, bigtime_t lateness, + bool realTimeEvent) { //CALLED(); switch (event->type) { @@ -963,14 +956,12 @@ void MultiAudioNode::HandleEvent( } } -// protected: // how should we handle late buffers? drop them? // notify the producer? -status_t MultiAudioNode::HandleBuffer( - const media_timed_event *event, - bigtime_t lateness, - bool realTimeEvent) +status_t +MultiAudioNode::HandleBuffer(const media_timed_event* event, bigtime_t lateness, + bool realTimeEvent) { //CALLED(); BBuffer * buffer = const_cast((BBuffer*)event->pointer); @@ -1023,10 +1014,10 @@ status_t MultiAudioNode::HandleBuffer( return B_OK; } -status_t MultiAudioNode::HandleDataStatus( - const media_timed_event *event, - bigtime_t lateness, - bool realTimeEvent) + +status_t +MultiAudioNode::HandleDataStatus(const media_timed_event* event, + bigtime_t lateness, bool realTimeEvent) { //CALLED(); PRINT(("MultiAudioNode::HandleDataStatus status:%li, lateness:%li\n", event->data, lateness)); @@ -1043,41 +1034,41 @@ status_t MultiAudioNode::HandleDataStatus( return B_OK; } -status_t MultiAudioNode::HandleStart( - const media_timed_event *event, - bigtime_t lateness, - bool realTimeEvent) + +status_t +MultiAudioNode::HandleStart(const media_timed_event *event, bigtime_t lateness, + bool realTimeEvent) { CALLED(); if (RunState() != B_STARTED) { - } return B_OK; } -status_t MultiAudioNode::HandleSeek( - const media_timed_event *event, - bigtime_t lateness, - bool realTimeEvent) + +status_t +MultiAudioNode::HandleSeek(const media_timed_event* event, bigtime_t lateness, + bool realTimeEvent) { CALLED(); - PRINT(("MultiAudioNode::HandleSeek(t=%lld,d=%li,bd=%lld)\n",event->event_time,event->data,event->bigdata)); + PRINT(("MultiAudioNode::HandleSeek(t=%lld,d=%li,bd=%lld)\n", + event->event_time,event->data,event->bigdata)); return B_OK; } - -status_t MultiAudioNode::HandleWarp( - const media_timed_event *event, - bigtime_t lateness, - bool realTimeEvent) + + +status_t +MultiAudioNode::HandleWarp(const media_timed_event* event, bigtime_t lateness, + bool realTimeEvent) { CALLED(); return B_OK; } -status_t MultiAudioNode::HandleStop( - const media_timed_event *event, - bigtime_t lateness, - bool realTimeEvent) + +status_t +MultiAudioNode::HandleStop(const media_timed_event* event, bigtime_t lateness, + bool realTimeEvent) { CALLED(); // flush the queue so downstreamers don't get any more @@ -1087,7 +1078,9 @@ status_t MultiAudioNode::HandleStop( return B_OK; } -status_t MultiAudioNode::HandleParameter( + +status_t +MultiAudioNode::HandleParameter( const media_timed_event *event, bigtime_t lateness, bool realTimeEvent) @@ -1096,9 +1089,9 @@ status_t MultiAudioNode::HandleParameter( return B_OK; } -// -------------------------------------------------------- // -// implemention of BTimeSource -// -------------------------------------------------------- // + +// #pragma mark - BTimeSource + void MultiAudioNode::SetRunMode(run_mode mode) @@ -1108,6 +1101,7 @@ MultiAudioNode::SetRunMode(run_mode mode) //BTimeSource::SetRunMode(mode); } + status_t MultiAudioNode::TimeSourceOp(const time_source_op_info &op, void *_reserved) { @@ -1153,11 +1147,11 @@ MultiAudioNode::TimeSourceOp(const time_source_op_info &op, void *_reserved) return B_OK; } -// -------------------------------------------------------- // -// implemention of BControllable -// -------------------------------------------------------- // -status_t +// #pragma mark - BControllable + + +status_t MultiAudioNode::GetParameterValue(int32 id, bigtime_t* last_change, void* value, size_t* ioSize) { CALLED(); @@ -1242,7 +1236,8 @@ MultiAudioNode::GetParameterValue(int32 id, bigtime_t* last_change, void* value, return B_OK; } -void + +void MultiAudioNode::SetParameterValue(int32 id, bigtime_t performance_time, const void* value, size_t size) { CALLED(); @@ -1304,16 +1299,17 @@ MultiAudioNode::SetParameterValue(int32 id, bigtime_t performance_time, const vo } -BParameterWeb* + +BParameterWeb* MultiAudioNode::MakeParameterWeb() { CALLED(); BParameterWeb* web = new BParameterWeb; - PRINT(("MMCI.control_count : %i\n", fDevice->MMCI.control_count)); - multi_mix_control *MMC = fDevice->MMCI.controls; + PRINT(("MixControlInfo().control_count : %i\n", fDevice->MixControlInfo().control_count)); + multi_mix_control *MMC = fDevice->MixControlInfo().controls; - for(int i=0; iMMCI.control_count; i++) { + for(int i=0; iMixControlInfo().control_count; i++) { if(MMC[i].flags & B_MULTI_MIX_GROUP && MMC[i].parent == 0) { PRINT(("NEW_GROUP\n")); int32 nb = 0; @@ -1330,13 +1326,14 @@ MultiAudioNode::MakeParameterWeb() return web; } -void + +void MultiAudioNode::ProcessGroup(BParameterGroup *group, int32 index, int32 &nbParameters) { CALLED(); - multi_mix_control *parent = &fDevice->MMCI.controls[index]; - multi_mix_control *MMC = fDevice->MMCI.controls; - for(int32 i=0; iMMCI.control_count; i++) { + multi_mix_control *parent = &fDevice->MixControlInfo().controls[index]; + multi_mix_control *MMC = fDevice->MixControlInfo().controls; + for(int32 i=0; iMixControlInfo().control_count; i++) { if(MMC[i].parent != parent->id) continue; @@ -1366,7 +1363,7 @@ MultiAudioNode::ProcessGroup(BParameterGroup *group, int32 index, int32 &nbParam group->MakeContinuousParameter(100 + MMC[i].id, B_MEDIA_RAW_AUDIO, "", B_MASTER_GAIN, "dB", MMC[i].gain.min_gain, MMC[i].gain.max_gain, MMC[i].gain.granularity); - if(i+1 MMCI.control_count && MMC[i+1].master == MMC[i].id && MMC[i+1].flags & B_MULTI_MIX_GAIN) { + if(i+1 MixControlInfo().control_count && MMC[i+1].master == MMC[i].id && MMC[i+1].flags & B_MULTI_MIX_GAIN) { group->ParameterAt(nbParameters)->SetChannelCount( group->ParameterAt(nbParameters)->CountChannels() + 1); i++; @@ -1391,14 +1388,15 @@ MultiAudioNode::ProcessGroup(BParameterGroup *group, int32 index, int32 &nbParam } } -void + +void MultiAudioNode::ProcessMux(BDiscreteParameter *parameter, int32 index) { CALLED(); - multi_mix_control *parent = &fDevice->MMCI.controls[index]; - multi_mix_control *MMC = fDevice->MMCI.controls; + multi_mix_control *parent = &fDevice->MixControlInfo().controls[index]; + multi_mix_control *MMC = fDevice->MixControlInfo().controls; int32 itemIndex = 0; - for(int32 i=0; iMMCI.control_count; i++) { + for(int32 i=0; iMixControlInfo().control_count; i++) { if(MMC[i].parent != parent->id) continue; @@ -1416,9 +1414,9 @@ MultiAudioNode::ProcessMux(BDiscreteParameter *parameter, int32 index) } } -// -------------------------------------------------------- // -// MultiAudioNode specific functions -// -------------------------------------------------------- // + +// #pragma mark - MultiAudioNode specific functions + int32 MultiAudioNode::RunThread() @@ -1436,7 +1434,7 @@ MultiAudioNode::RunThread() if ( acquire_sem_etc( fBuffer_free, 1, B_RELATIVE_TIMEOUT, 0 ) == B_BAD_SEM_ID ) { return B_OK; } - + //send buffer fDevice->DoBufferExchange(&MBI); @@ -1452,16 +1450,16 @@ MultiAudioNode::RunThread() if ((MBI._reserved_0 == input->fChannelId) && MBI.playback_buffer_cycle >= 0 - && MBI.playback_buffer_cycle < fDevice->MBL.return_playback_buffers + && MBI.playback_buffer_cycle < fDevice->BufferList().return_playback_buffers && (input->fOldMBI.playback_buffer_cycle != MBI.playback_buffer_cycle - || fDevice->MBL.return_playback_buffers == 1) + || fDevice->BufferList().return_playback_buffers == 1) && (input->fInput.source != media_source::null || input->fChannelId == 0)) { //PRINT(("playback_buffer_cycle ok input : %i %d\n", i, MBI.playback_buffer_cycle)); input->fBufferCycle = (MBI.playback_buffer_cycle - 1 - + fDevice->MBL.return_playback_buffers) % fDevice->MBL.return_playback_buffers; + + fDevice->BufferList().return_playback_buffers) % fDevice->BufferList().return_playback_buffers; // update the timesource if(input->fChannelId==0) { @@ -1497,9 +1495,9 @@ MultiAudioNode::RunThread() if ((RunState() == BMediaEventLooper::B_STARTED) && (output->fOutput.destination != media_destination::null)) { if ((MBI._reserved_1 == output->fChannelId) && MBI.record_buffer_cycle >= 0 - && MBI.record_buffer_cycle < fDevice->MBL.return_record_buffers + && MBI.record_buffer_cycle < fDevice->BufferList().return_record_buffers && (output->fOldMBI.record_buffer_cycle != MBI.record_buffer_cycle - || fDevice->MBL.return_record_buffers == 1)) { + || fDevice->BufferList().return_record_buffers == 1)) { //PRINT(("record_buffer_cycle ok\n")); // Get the next buffer of data @@ -1532,29 +1530,30 @@ MultiAudioNode::RunThread() return B_OK; } + void MultiAudioNode::WriteZeros(node_input &input, uint32 bufferCycle) { //CALLED(); /*int32 samples = input.fInput.format.u.raw_audio.buffer_size; if(input.fInput.format.u.raw_audio.format == media_raw_audio_format::B_AUDIO_UCHAR) { - uint8 *sample = (uint8*)fDevice->MBL.playback_buffers[input.fBufferCycle][input.fChannelId].base; + uint8 *sample = (uint8*)fDevice->BufferList().playback_buffers[input.fBufferCycle][input.fChannelId].base; for(int32 i = samples-1; i>=0; i--) *sample++ = 128; } else { - int32 *sample = (int32*)fDevice->MBL.playback_buffers[input.fBufferCycle][input.fChannelId].base; + int32 *sample = (int32*)fDevice->BufferList().playback_buffers[input.fBufferCycle][input.fChannelId].base; for(int32 i = (samples / 4)-1; i>=0; i--) *sample++ = 0;*/ - size_t stride = fDevice->MBL.playback_buffers[bufferCycle][input.fChannelId].stride; + size_t stride = fDevice->BufferList().playback_buffers[bufferCycle][input.fChannelId].stride; uint32 channelCount = input.fFormat.u.raw_audio.channel_count; switch(input.fFormat.u.raw_audio.format) { case media_raw_audio_format::B_AUDIO_FLOAT: for(uint32 channel = 0; channel < channelCount; channel++) { - char *sample_dest = fDevice->MBL.playback_buffers[bufferCycle][input.fChannelId + channel].base; - for(uint32 i=fDevice->MBL.return_playback_buffer_size; i>0; i--) { + char *sample_dest = fDevice->BufferList().playback_buffers[bufferCycle][input.fChannelId + channel].base; + for(uint32 i=fDevice->BufferList().return_playback_buffer_size; i>0; i--) { *(float*)sample_dest = 0; sample_dest += stride; } @@ -1562,8 +1561,8 @@ MultiAudioNode::WriteZeros(node_input &input, uint32 bufferCycle) break; case media_raw_audio_format::B_AUDIO_INT: for(uint32 channel = 0; channel < channelCount; channel++) { - char *sample_dest = fDevice->MBL.playback_buffers[bufferCycle][input.fChannelId + channel].base; - for(uint32 i=fDevice->MBL.return_playback_buffer_size; i>0; i--) { + char *sample_dest = fDevice->BufferList().playback_buffers[bufferCycle][input.fChannelId + channel].base; + for(uint32 i=fDevice->BufferList().return_playback_buffer_size; i>0; i--) { *(int32*)sample_dest = 0; sample_dest += stride; } @@ -1571,8 +1570,8 @@ MultiAudioNode::WriteZeros(node_input &input, uint32 bufferCycle) break; case media_raw_audio_format::B_AUDIO_SHORT:{ for(uint32 channel = 0; channel < channelCount; channel++) { - char *sample_dest = fDevice->MBL.playback_buffers[bufferCycle][input.fChannelId + channel].base; - for(uint32 i=fDevice->MBL.return_playback_buffer_size; i>0; i--) { + char *sample_dest = fDevice->BufferList().playback_buffers[bufferCycle][input.fChannelId + channel].base; + for(uint32 i=fDevice->BufferList().return_playback_buffer_size; i>0; i--) { *(int16*)sample_dest = 0; sample_dest += stride; } @@ -1585,14 +1584,16 @@ MultiAudioNode::WriteZeros(node_input &input, uint32 bufferCycle) } + void MultiAudioNode::FillWithZeros(node_input &input) { CALLED(); - for(int32 i=0; iMBL.return_playback_buffers; i++) + for(int32 i=0; iBufferList().return_playback_buffers; i++) WriteZeros(input, i); } + void MultiAudioNode::FillNextBuffer(node_input &input, BBuffer* buffer) { @@ -1602,13 +1603,13 @@ MultiAudioNode::FillNextBuffer(node_input &input, BBuffer* buffer) switch(input.fFormat.u.raw_audio.format) { case media_raw_audio_format::B_AUDIO_FLOAT: { size_t frame_size = input.fInput.format.u.raw_audio.channel_count * sizeof(float); - 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)); + size_t stride = fDevice->BufferList().playback_buffers[input.fBufferCycle][input.fChannelId].stride; + //PRINT(("stride : %i, frame_size : %i, return_playback_buffer_size : %i\n", stride, frame_size, fDevice->BufferList().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_dest = fDevice->BufferList().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(float); - for(uint32 i=fDevice->MBL.return_playback_buffer_size; i>0; i--) { + for(uint32 i=fDevice->BufferList().return_playback_buffer_size; i>0; i--) { *(float *)sample_dest = *(float *)sample_src; sample_dest += stride; sample_src += frame_size; @@ -1620,27 +1621,27 @@ MultiAudioNode::FillNextBuffer(node_input &input, BBuffer* buffer) break; case media_raw_audio_format::B_AUDIO_SHORT: if(input.fInput.format.u.raw_audio.channel_count == 2) { - int16 *sample_dest1 = (int16*)fDevice->MBL.playback_buffers[input.fBufferCycle][input.fChannelId].base; - int16 *sample_dest2 = (int16*)fDevice->MBL.playback_buffers[input.fBufferCycle][input.fChannelId + 1].base; + int16 *sample_dest1 = (int16*)fDevice->BufferList().playback_buffers[input.fBufferCycle][input.fChannelId].base; + int16 *sample_dest2 = (int16*)fDevice->BufferList().playback_buffers[input.fBufferCycle][input.fChannelId + 1].base; float *sample_src = (float*)buffer->Data(); - if(fDevice->MBL.playback_buffers[input.fBufferCycle][input.fChannelId].stride == sizeof(int16) - && fDevice->MBL.playback_buffers[input.fBufferCycle][input.fChannelId + 1].stride == sizeof(int16)) { + if(fDevice->BufferList().playback_buffers[input.fBufferCycle][input.fChannelId].stride == sizeof(int16) + && fDevice->BufferList().playback_buffers[input.fBufferCycle][input.fChannelId + 1].stride == sizeof(int16)) { //PRINT(("FillNextBuffer : 2 channels strides 2\n")); - for(uint32 i=fDevice->MBL.return_playback_buffer_size; i>0; i--) { + for(uint32 i=fDevice->BufferList().return_playback_buffer_size; i>0; i--) { *sample_dest1++ = int16(32767 * *sample_src++); *sample_dest2++ = int16(32767 * *sample_src++); } - } else if(fDevice->MBL.playback_buffers[input.fBufferCycle][input.fChannelId].stride == 2 * sizeof(int16) - && fDevice->MBL.playback_buffers[input.fBufferCycle][input.fChannelId + 1].stride == 2 * sizeof(int16) + } else if(fDevice->BufferList().playback_buffers[input.fBufferCycle][input.fChannelId].stride == 2 * sizeof(int16) + && fDevice->BufferList().playback_buffers[input.fBufferCycle][input.fChannelId + 1].stride == 2 * sizeof(int16) && sample_dest1 + 1 == sample_dest2) { //PRINT(("FillNextBuffer : 2 channels strides 4\n")); - for(uint32 i=2*fDevice->MBL.return_playback_buffer_size; i>0; i--) + for(uint32 i=2*fDevice->BufferList().return_playback_buffer_size; i>0; i--) *sample_dest1++ = int16(32767 * *sample_src++); } else { //PRINT(("FillNextBuffer : 2 channels strides != 2\n")); - size_t stride1 = fDevice->MBL.playback_buffers[input.fBufferCycle][input.fChannelId].stride / sizeof(int16); - size_t stride2 = fDevice->MBL.playback_buffers[input.fBufferCycle][input.fChannelId + 1].stride / sizeof(int16); - for(uint32 i=fDevice->MBL.return_playback_buffer_size; i>0; i--) { + size_t stride1 = fDevice->BufferList().playback_buffers[input.fBufferCycle][input.fChannelId].stride / sizeof(int16); + size_t stride2 = fDevice->BufferList().playback_buffers[input.fBufferCycle][input.fChannelId + 1].stride / sizeof(int16); + for(uint32 i=fDevice->BufferList().return_playback_buffer_size; i>0; i--) { *sample_dest1 = int16(32767 * *sample_src++); *sample_dest2 = int16(32767 * *sample_src++); sample_dest1 += stride1; @@ -1649,13 +1650,13 @@ MultiAudioNode::FillNextBuffer(node_input &input, BBuffer* buffer) } } else { size_t frame_size = input.fInput.format.u.raw_audio.channel_count * sizeof(int16); - 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)); + size_t stride = fDevice->BufferList().playback_buffers[input.fBufferCycle][input.fChannelId].stride; + //PRINT(("stride : %i, frame_size : %i, return_playback_buffer_size : %i\n", stride, frame_size, fDevice->BufferList().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_dest = fDevice->BufferList().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(int16); - for(uint32 i=fDevice->MBL.return_playback_buffer_size; i>0; i--) { + for(uint32 i=fDevice->BufferList().return_playback_buffer_size; i>0; i--) { *(int16*)sample_dest = int16(32767 * *(float*)sample_src); sample_dest += stride; sample_src += frame_size; @@ -1674,13 +1675,13 @@ MultiAudioNode::FillNextBuffer(node_input &input, BBuffer* buffer) 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)); + size_t stride = fDevice->BufferList().playback_buffers[input.fBufferCycle][input.fChannelId].stride; + //PRINT(("stride : %i, frame_size : %i, return_playback_buffer_size : %i\n", stride, frame_size, fDevice->BufferList().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_dest = fDevice->BufferList().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--) { + for(uint32 i=fDevice->BufferList().return_playback_buffer_size; i>0; i--) { *(int32 *)sample_dest = *(int32 *)sample_src; sample_dest += stride; sample_src += frame_size; @@ -1703,26 +1704,26 @@ MultiAudioNode::FillNextBuffer(node_input &input, BBuffer* buffer) break; case media_raw_audio_format::B_AUDIO_SHORT: if(input.fInput.format.u.raw_audio.channel_count == 2) { - int16 *sample_dest1 = (int16*)fDevice->MBL.playback_buffers[input.fBufferCycle][input.fChannelId].base; - int16 *sample_dest2 = (int16*)fDevice->MBL.playback_buffers[input.fBufferCycle][input.fChannelId + 1].base; + int16 *sample_dest1 = (int16*)fDevice->BufferList().playback_buffers[input.fBufferCycle][input.fChannelId].base; + int16 *sample_dest2 = (int16*)fDevice->BufferList().playback_buffers[input.fBufferCycle][input.fChannelId + 1].base; int16 *sample_src = (int16*)buffer->Data(); - if(fDevice->MBL.playback_buffers[input.fBufferCycle][input.fChannelId].stride == sizeof(int16) - && fDevice->MBL.playback_buffers[input.fBufferCycle][input.fChannelId + 1].stride == sizeof(int16)) { + if(fDevice->BufferList().playback_buffers[input.fBufferCycle][input.fChannelId].stride == sizeof(int16) + && fDevice->BufferList().playback_buffers[input.fBufferCycle][input.fChannelId + 1].stride == sizeof(int16)) { //PRINT(("FillNextBuffer : 2 channels strides 2\n")); - for(uint32 i=fDevice->MBL.return_playback_buffer_size; i>0; i--) { + for(uint32 i=fDevice->BufferList().return_playback_buffer_size; i>0; i--) { *sample_dest1++ = *sample_src++; *sample_dest2++ = *sample_src++; } - } else if(fDevice->MBL.playback_buffers[input.fBufferCycle][input.fChannelId].stride == 2 * sizeof(int16) - && fDevice->MBL.playback_buffers[input.fBufferCycle][input.fChannelId + 1].stride == 2 * sizeof(int16) + } else if(fDevice->BufferList().playback_buffers[input.fBufferCycle][input.fChannelId].stride == 2 * sizeof(int16) + && fDevice->BufferList().playback_buffers[input.fBufferCycle][input.fChannelId + 1].stride == 2 * sizeof(int16) && sample_dest1 + 1 == sample_dest2) { //PRINT(("FillNextBuffer : 2 channels strides 4\n")); - memcpy(sample_dest1, sample_src, fDevice->MBL.return_playback_buffer_size * 2 * sizeof(int16)); + memcpy(sample_dest1, sample_src, fDevice->BufferList().return_playback_buffer_size * 2 * sizeof(int16)); } else { //PRINT(("FillNextBuffer : 2 channels strides != 2\n")); - size_t stride1 = fDevice->MBL.playback_buffers[input.fBufferCycle][input.fChannelId].stride / 2; - size_t stride2 = fDevice->MBL.playback_buffers[input.fBufferCycle][input.fChannelId + 1].stride / 2; - for(uint32 i=fDevice->MBL.return_playback_buffer_size; i>0; i--) { + size_t stride1 = fDevice->BufferList().playback_buffers[input.fBufferCycle][input.fChannelId].stride / 2; + size_t stride2 = fDevice->BufferList().playback_buffers[input.fBufferCycle][input.fChannelId + 1].stride / 2; + for(uint32 i=fDevice->BufferList().return_playback_buffer_size; i>0; i--) { *sample_dest1 = *sample_src++; *sample_dest2 = *sample_src++; sample_dest1 += stride1; @@ -1731,13 +1732,13 @@ MultiAudioNode::FillNextBuffer(node_input &input, BBuffer* buffer) } } else { size_t frame_size = input.fInput.format.u.raw_audio.channel_count * sizeof(int16); - 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)); + size_t stride = fDevice->BufferList().playback_buffers[input.fBufferCycle][input.fChannelId].stride; + //PRINT(("stride : %i, frame_size : %i, return_playback_buffer_size : %i\n", stride, frame_size, fDevice->BufferList().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_dest = fDevice->BufferList().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(int16); - for(uint32 i=fDevice->MBL.return_playback_buffer_size; i>0; i--) { + for(uint32 i=fDevice->BufferList().return_playback_buffer_size; i>0; i--) { *(int16 *)sample_dest = *(int16 *)sample_src; sample_dest += stride; sample_src += frame_size; @@ -1756,6 +1757,7 @@ MultiAudioNode::FillNextBuffer(node_input &input, BBuffer* buffer) } } + status_t MultiAudioNode::StartThread() { @@ -1765,7 +1767,7 @@ MultiAudioNode::StartThread() return B_OK; //allocate buffer free semaphore - fBuffer_free = create_sem( fDevice->MBL.return_playback_buffers - 1, "multi_audio out buffer free" ); + fBuffer_free = create_sem( fDevice->BufferList().return_playback_buffers - 1, "multi_audio out buffer free" ); if ( fBuffer_free < B_OK ) { return B_ERROR; @@ -1783,6 +1785,7 @@ MultiAudioNode::StartThread() return B_OK; } + status_t MultiAudioNode::StopThread() { @@ -1792,7 +1795,8 @@ MultiAudioNode::StopThread() return B_OK; } -void + +void MultiAudioNode::AllocateBuffers(node_output &channel) { CALLED(); @@ -1806,6 +1810,7 @@ MultiAudioNode::AllocateBuffers(node_output &channel) channel.fBufferGroup = new BBufferGroup(size, count); } + void MultiAudioNode::UpdateTimeSource(multi_buffer_info &MBI, multi_buffer_info &oldMBI, node_input &input) { @@ -1823,6 +1828,7 @@ MultiAudioNode::UpdateTimeSource(multi_buffer_info &MBI, multi_buffer_info &oldM } } + BBuffer* MultiAudioNode::FillNextBuffer(multi_buffer_info &MBI, node_output &channel) { @@ -1842,50 +1848,51 @@ MultiAudioNode::FillNextBuffer(multi_buffer_info &MBI, node_output &channel) if (!buffer) return NULL; - if(fDevice==NULL) - fprintf(stderr,"fDevice NULL\n"); - if(buffer->Header()==NULL) - fprintf(stderr,"buffer->Header() NULL\n"); - if(TimeSource()==NULL) - fprintf(stderr,"TimeSource() NULL\n"); - + if (fDevice == NULL) + fprintf(stderr, "fDevice NULL\n"); + if (buffer->Header() == NULL) + fprintf(stderr, "buffer->Header() NULL\n"); + if (TimeSource() == NULL) + fprintf(stderr, "TimeSource() NULL\n"); + // now fill it with data, continuing where the last buffer left off - memcpy( buffer->Data(), - fDevice->MBL.record_buffers[MBI.record_buffer_cycle][channel.fChannelId - fDevice->MD.output_channel_count].base, + memcpy(buffer->Data(), + fDevice->BufferList().record_buffers[MBI.record_buffer_cycle][channel.fChannelId - fDevice->Description().output_channel_count].base, channel.fOutput.format.u.raw_audio.buffer_size ); - + // fill in the buffer header media_header* hdr = buffer->Header(); hdr->type = B_MEDIA_RAW_AUDIO; hdr->size_used = channel.fOutput.format.u.raw_audio.buffer_size; hdr->time_source = TimeSource()->ID(); hdr->start_time = PerformanceTimeFor(MBI.recorded_real_time); - + return buffer; } + status_t -MultiAudioNode::GetConfigurationFor(BMessage * into_message) +MultiAudioNode::GetConfigurationFor(BMessage* into_message) { CALLED(); - + BParameter *parameter = NULL; void *buffer; size_t size = 128; bigtime_t last_change; status_t err; - - if(!into_message) + + if (!into_message) return B_BAD_VALUE; - + buffer = malloc(size); - - for(int32 i=0; iCountParameters(); i++) { + + for (int32 i = 0; i < fWeb->CountParameters(); i++) { parameter = fWeb->ParameterAt(i); - if(parameter->Type() != BParameter::B_CONTINUOUS_PARAMETER + if (parameter->Type() != BParameter::B_CONTINUOUS_PARAMETER && parameter->Type() != BParameter::B_DISCRETE_PARAMETER) continue; - + PRINT(("getting parameter %i\n", parameter->ID())); size = 128; while((err = GetParameterValue(parameter->ID(), &last_change, buffer, &size))==B_NO_MEMORY) { @@ -1893,89 +1900,89 @@ MultiAudioNode::GetConfigurationFor(BMessage * into_message) free(buffer); buffer = malloc(size); } - - if(err == B_OK && size > 0) { + + if (err == B_OK && size > 0) { into_message->AddInt32("parameterID", parameter->ID()); into_message->AddData("parameterData", B_RAW_TYPE, buffer, size, false); } else { PRINT(("parameter err : %s\n", strerror(err))); } } - + PRINT_OBJECT(*into_message); - + return B_OK; } + node_output* MultiAudioNode::FindOutput(media_source source) { node_output *channel = NULL; - for(int32 i=0; ifOutput.source) + if (source == channel->fOutput.source) break; } - + if (source != channel->fOutput.source) return NULL; - else - return channel; - + + return channel; } + node_input* MultiAudioNode::FindInput(media_destination dest) { node_input *channel = NULL; - for(int32 i=0; ifInput.destination) + if (dest == channel->fInput.destination) break; } - + if (dest != channel->fInput.destination) return NULL; - else - return channel; - + + return channel; } + node_input* MultiAudioNode::FindInput(int32 destinationId) { node_input *channel = NULL; - for(int32 i=0; ifInput.destination.id) + if (destinationId == channel->fInput.destination.id) break; } - + if (destinationId != channel->fInput.destination.id) return NULL; - else - return channel; - + + return channel; } -// static: -int32 -MultiAudioNode::_run_thread_( void *data ) +/*static*/ status_t +MultiAudioNode::_run_thread_(void* data) { CALLED(); - return static_cast( data )->RunThread(); + return static_cast(data)->RunThread(); } -void MultiAudioNode::GetFlavor(flavor_info * outInfo, int32 id) + +void +MultiAudioNode::GetFlavor(flavor_info* outInfo, int32 id) { CALLED(); - if (outInfo == 0) { + if (outInfo == 0) return; - } outInfo->flavor_flags = 0; outInfo->possible_count = 1; // one flavor at a time @@ -1984,30 +1991,33 @@ void MultiAudioNode::GetFlavor(flavor_info * outInfo, int32 id) outInfo->out_format_count = 0; // no outputs outInfo->out_formats = 0; outInfo->internal_id = id; - + outInfo->name = "MultiAudioNode Node"; outInfo->info = "The MultiAudioNode node outputs to multi_audio drivers."; outInfo->kinds = B_BUFFER_CONSUMER | B_BUFFER_PRODUCER | B_TIME_SOURCE - | B_PHYSICAL_OUTPUT | B_PHYSICAL_INPUT | B_CONTROLLABLE; + | B_PHYSICAL_OUTPUT | B_PHYSICAL_INPUT | B_CONTROLLABLE; outInfo->in_format_count = 1; // 1 input media_format * informats = new media_format[outInfo->in_format_count]; GetFormat(&informats[0]); outInfo->in_formats = informats; - + outInfo->out_format_count = 1; // 1 output media_format * outformats = new media_format[outInfo->out_format_count]; GetFormat(&outformats[0]); outInfo->out_formats = outformats; } -void MultiAudioNode::GetFormat(media_format * outFormat) + +void +MultiAudioNode::GetFormat(media_format* outFormat) { CALLED(); - if (outFormat == 0) { + if (outFormat == NULL) return; - } + outFormat->type = B_MEDIA_RAW_AUDIO; outFormat->require_flags = B_MEDIA_MAUI_UNDEFINED_FLAGS; outFormat->deny_flags = B_MEDIA_MAUI_UNDEFINED_FLAGS; outFormat->u.raw_audio = media_raw_audio_format::wildcard; } + 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 42c54b62b4..daffc849b0 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 @@ -27,8 +27,7 @@ const media_format & consumer_format);*/ -class node_input -{ +class node_input { public: node_input(media_input &input, media_format format); ~node_input(); @@ -42,8 +41,7 @@ class node_input BBuffer *fBuffer; }; -class node_output -{ +class node_output { public: node_output(media_output &output, media_format format); ~node_output(); @@ -60,47 +58,38 @@ class node_output multi_buffer_info fOldMBI; }; -class MultiAudioNode : - public BBufferConsumer, - public BBufferProducer, - public BTimeSource, - public BMediaEventLooper, - public BControllable -{ - protected: - virtual ~MultiAudioNode(void); +class MultiAudioNode : public BBufferConsumer, public BBufferProducer, + public BTimeSource, public BMediaEventLooper, public BControllable { +protected: + virtual ~MultiAudioNode(void); - public: +public: + explicit MultiAudioNode(BMediaAddOn* addon, const char* name, + MultiAudioDevice* device, int32 internalID, BMessage* config); - explicit MultiAudioNode(BMediaAddOn *addon, char* name, MultiAudioDevice *device, - int32 internal_id, BMessage * config); - - virtual status_t InitCheck(void) const; + virtual status_t InitCheck(void) const; /*************************/ /* begin from BMediaNode */ - public: - virtual BMediaAddOn* AddOn( - int32 * internal_id) const; /* Who instantiated you -- or NULL for app class */ +public: + virtual BMediaAddOn* AddOn(int32* internalID) const; - protected: - /* These don't return errors; instead, they use the global error condition reporter. */ - /* A node is required to have a queue of at least one pending command (plus TimeWarp) */ - /* and is recommended to allow for at least one pending command of each type. */ - /* Allowing an arbitrary number of outstanding commands might be nice, but apps */ - /* cannot depend on that happening. */ - virtual void Preroll(void); +protected: + /* These don't return errors; instead, they use the global error condition reporter. */ + /* A node is required to have a queue of at least one pending command (plus TimeWarp) */ + /* and is recommended to allow for at least one pending command of each type. */ + /* Allowing an arbitrary number of outstanding commands might be nice, but apps */ + /* cannot depend on that happening. */ + virtual void Preroll(void); - public: - virtual status_t HandleMessage( - int32 message, - const void * data, - size_t size); +public: + virtual status_t HandleMessage(int32 message, const void* data, + size_t size); - protected: - virtual void NodeRegistered(void); /* reserved 2 */ - virtual status_t RequestCompleted(const media_request_info &info); - virtual void SetTimeSource(BTimeSource *timeSource); +protected: + virtual void NodeRegistered(); + virtual status_t RequestCompleted(const media_request_info &info); + virtual void SetTimeSource(BTimeSource *timeSource); /* end from BMediaNode */ /***********************/ @@ -108,61 +97,28 @@ class MultiAudioNode : /******************************/ /* begin from BBufferConsumer */ -//included from BMediaAddOn -//virtual status_t HandleMessage( -// int32 message, -// const void * data, -// size_t size); + virtual status_t AcceptFormat(const media_destination& dest, + media_format* format); + virtual status_t GetNextInput(int32* cookie, media_input* input); + virtual void DisposeInputCookie(int32 cookie); + virtual void BufferReceived(BBuffer* buffer); + virtual void ProducerDataStatus(const media_destination& forWhom, + int32 status, bigtime_t atPerformanceTime); + virtual status_t GetLatencyFor(const media_destination& forWhom, + bigtime_t* latency, media_node_id* timeSource); + virtual status_t Connected(const media_source& producer, + const media_destination& where, + const media_format& withFormat, media_input* input); + virtual void Disconnected(const media_source& producer, + const media_destination& where); + virtual status_t FormatChanged(const media_source& producer, + const media_destination& consumer, int32 changeTag, + const media_format& format); - /* Someone, probably the producer, is asking you about this format. Give */ - /* your honest opinion, possibly modifying *format. Do not ask upstream */ - /* producer about the format, since he's synchronously waiting for your */ - /* reply. */ - virtual status_t AcceptFormat( - const media_destination & dest, - media_format * format); - virtual status_t GetNextInput( - int32 * cookie, - media_input * out_input); - virtual void DisposeInputCookie( - int32 cookie); - virtual void BufferReceived( - BBuffer * buffer); - virtual void ProducerDataStatus( - const media_destination & for_whom, - int32 status, - bigtime_t at_performance_time); - virtual status_t GetLatencyFor( - const media_destination & for_whom, - bigtime_t * out_latency, - media_node_id * out_timesource); - virtual status_t Connected( - const media_source & producer, /* here's a good place to request buffer group usage */ - const media_destination & where, - const media_format & with_format, - media_input * out_input); - virtual void Disconnected( - const media_source & producer, - const media_destination & where); - /* The notification comes from the upstream producer, so he's already cool with */ - /* the format; you should not ask him about it in here. */ - virtual status_t FormatChanged( - const media_source & producer, - const media_destination & consumer, - int32 change_tag, - const media_format & format); - - /* Given a performance time of some previous buffer, retrieve the remembered tag */ - /* of the closest (previous or exact) performance time. Set *out_flags to 0; the */ - /* idea being that flags can be added later, and the understood flags returned in */ - /* *out_flags. */ - virtual status_t SeekTagRequested( - const media_destination & destination, - bigtime_t in_target_time, - uint32 in_flags, - media_seek_tag * out_seek_tag, - bigtime_t * out_tagged_time, - uint32 * out_flags); + virtual status_t SeekTagRequested(const media_destination& destination, + bigtime_t targetTime, uint32 flags, + media_seek_tag* _seekTag, bigtime_t* _taggedTime, + uint32* _flags); /* end from BBufferConsumer */ /****************************/ diff --git a/src/add-ons/media/media-add-ons/multi_audio/MultiAudioUtility.cpp b/src/add-ons/media/media-add-ons/multi_audio/MultiAudioUtility.cpp new file mode 100644 index 0000000000..73355fe325 --- /dev/null +++ b/src/add-ons/media/media-add-ons/multi_audio/MultiAudioUtility.cpp @@ -0,0 +1,235 @@ +/* + * Copyright 2008, Axel Dörfler, axeld@pinc-software.de. + * Copyright (c) 2002-2007, Jerome Duval (jerome.duval@free.fr) + * + * Distributed under the terms of the MIT License. + */ + + +#include "MultiAudioUtility.h" + +#include + +#include + + +const float kSampleRates[] = { + 8000.0, 11025.0, 12000.0, 16000.0, 22050.0, 24000.0, 32000.0, 44100.0, + 48000.0, 64000.0, 88200.0, 96000.0, 176400.0, 192000.0, 384000.0, 1536000.0 +}; +const uint32 kSampleRateCount = sizeof(kSampleRates) / sizeof(kSampleRates[0]); + + +template static status_t +call_driver(int device, int32 op, T* data) +{ + if (ioctl(device, op, data, sizeof(T)) != 0) + return errno; + + return B_OK; +} + + +namespace MultiAudio { + + +float +convert_to_sample_rate(uint32 rate) +{ + for (uint32 i = 0; i < kSampleRateCount; i++) { + if (rate & 1) + return kSampleRates[i]; + + rate >>= 1; + } + + return 0.0; +} + + +uint32 +convert_from_sample_rate(float rate) +{ + for (uint32 i = 0; i < kSampleRateCount; i++) { + if (rate <= kSampleRates[i]) + return 1 << i; + } + + return 0; +} + + +uint32 +convert_to_media_format(uint32 format) +{ + switch (format) { + case B_FMT_FLOAT: + return media_raw_audio_format::B_AUDIO_FLOAT; + case B_FMT_18BIT: + case B_FMT_20BIT: + case B_FMT_24BIT: + case B_FMT_32BIT: + return media_raw_audio_format::B_AUDIO_INT; + case B_FMT_16BIT: + return media_raw_audio_format::B_AUDIO_SHORT; + case B_FMT_8BIT_S: + return media_raw_audio_format::B_AUDIO_CHAR; + case B_FMT_8BIT_U: + return media_raw_audio_format::B_AUDIO_UCHAR; + + default: + return 0; + } +} + + +int16 +convert_to_valid_bits(uint32 format) +{ + switch (format) { + 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 +convert_from_media_format(uint32 format) +{ + switch (format) { + case media_raw_audio_format::B_AUDIO_FLOAT: + return B_FMT_FLOAT; + case media_raw_audio_format::B_AUDIO_INT: + return B_FMT_32BIT; + case media_raw_audio_format::B_AUDIO_SHORT: + return B_FMT_16BIT; + case media_raw_audio_format::B_AUDIO_CHAR: + return B_FMT_8BIT_S; + case media_raw_audio_format::B_AUDIO_UCHAR: + return B_FMT_8BIT_U; + + default: + return 0; + } +} + + +uint32 +select_sample_rate(uint32 rate) +{ + // highest rate + uint32 crate = B_SR_1536000; + while (crate != 0) { + if (rate & crate) + return crate; + crate >>= 1; + } + return 0; +} + + +uint32 +select_format(uint32 format) +{ + // best format + if (format & B_FMT_FLOAT) + return B_FMT_FLOAT; + if (format & B_FMT_32BIT) + return B_FMT_32BIT; + if (format & B_FMT_24BIT) + return B_FMT_24BIT; + if (format & B_FMT_20BIT) + return B_FMT_20BIT; + if (format & B_FMT_18BIT) + return B_FMT_18BIT; + if (format & B_FMT_16BIT) + return B_FMT_16BIT; + if (format & B_FMT_8BIT_S) + return B_FMT_8BIT_S; + if (format & B_FMT_8BIT_U) + return B_FMT_8BIT_U; + + return 0; +} + + +status_t +get_description(int device, multi_description* description) +{ + return call_driver(device, B_MULTI_GET_DESCRIPTION, description); +} + + +status_t +get_enabled_channels(int device, multi_channel_enable* enable) +{ + return call_driver(device, B_MULTI_GET_ENABLED_CHANNELS, enable); +} + + +status_t +set_enabled_channels(int device, multi_channel_enable* enable) +{ + return call_driver(device, B_MULTI_SET_ENABLED_CHANNELS, enable); +} + + +status_t +get_global_format(int device, multi_format_info* info) +{ + return call_driver(device, B_MULTI_GET_GLOBAL_FORMAT, info); +} + + +status_t +set_global_format(int device, multi_format_info* info) +{ + return call_driver(device, B_MULTI_SET_GLOBAL_FORMAT, info); +} + + +status_t +get_buffers(int device, multi_buffer_list* list) +{ + return call_driver(device, B_MULTI_GET_BUFFERS, list); +} + + +status_t +buffer_exchange(int device, multi_buffer_info* info) +{ + return call_driver(device, B_MULTI_BUFFER_EXCHANGE, info); +} + + +status_t +list_mix_controls(int device, multi_mix_control_info* info) +{ + return call_driver(device, B_MULTI_LIST_MIX_CONTROLS, info); +} + + +status_t +get_mix(int device, multi_mix_value_info* info) +{ + return call_driver(device, B_MULTI_GET_MIX, info); +} + + +status_t +set_mix(int device, multi_mix_value_info* info) +{ + return call_driver(device, B_MULTI_SET_MIX, info); +} + + +} // namespace MultiAudio diff --git a/src/add-ons/media/media-add-ons/multi_audio/MultiAudioUtility.h b/src/add-ons/media/media-add-ons/multi_audio/MultiAudioUtility.h new file mode 100644 index 0000000000..a3bcd680c2 --- /dev/null +++ b/src/add-ons/media/media-add-ons/multi_audio/MultiAudioUtility.h @@ -0,0 +1,42 @@ +/* + * Copyright 2008, Axel Dörfler, axeld@pinc-software.de. + * Copyright (c) 2002-2007, Jerome Duval (jerome.duval@free.fr) + * + * Distributed under the terms of the MIT License. + */ +#ifndef MULTI_AUDIO_UTILITY_H +#define MULTI_AUDIO_UTILITY_H + + +#include "hmulti_audio.h" + + +namespace MultiAudio { + +// sample rate & format conversion +float convert_to_sample_rate(uint32 rate); +uint32 convert_from_sample_rate(float rate); +uint32 convert_to_media_format(uint32 format); +int16 convert_to_valid_bits(uint32 format); +uint32 convert_from_media_format(uint32 format); +uint32 select_sample_rate(uint32 rate); +uint32 select_format(uint32 format); + +// device driver interface +status_t get_description(int device, multi_description* description); + +status_t get_enabled_channels(int device, multi_channel_enable* enable); +status_t set_enabled_channels(int device, multi_channel_enable* enable); + +status_t get_global_format(int device, multi_format_info* info); +status_t set_global_format(int device, multi_format_info* info); +status_t get_buffers(int device, multi_buffer_list* list); +status_t buffer_exchange(int device, multi_buffer_info* info); + +status_t list_mix_controls(int device, multi_mix_control_info* info); +status_t get_mix(int device, multi_mix_value_info* info); +status_t set_mix(int device, multi_mix_value_info* info); + +} // namespace MultiAudio + +#endif // MULTI_AUDIO_UTILITY_H diff --git a/src/add-ons/media/media-add-ons/multi_audio/driver_io.h b/src/add-ons/media/media-add-ons/multi_audio/driver_io.h deleted file mode 100644 index b030aa58b5..0000000000 --- a/src/add-ons/media/media-add-ons/multi_audio/driver_io.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * multiaudio replacement media addon for BeOS - * - * Copyright (c) 2002, Jerome Duval (jerome.duval@free.fr) - * Distributed under the terms of the MIT License. - */ -#ifndef _DRIVER_IO_H -#define _DRIVER_IO_H - -#include -#include -#include -#include "hmulti_audio.h" - -#define DRIVER_GET_DESCRIPTION(x...) ioctl( fd, B_MULTI_GET_DESCRIPTION, x ) -#define DRIVER_GET_ENABLED_CHANNELS(x...) ioctl( fd, B_MULTI_GET_ENABLED_CHANNELS, x ) -#define DRIVER_SET_ENABLED_CHANNELS(x...) ioctl( fd, B_MULTI_SET_ENABLED_CHANNELS, x ) -#define DRIVER_SET_GLOBAL_FORMAT(x...) ioctl( fd, B_MULTI_SET_GLOBAL_FORMAT, x ) -#define DRIVER_GET_BUFFERS(x...) ioctl( fd, B_MULTI_GET_BUFFERS, x ) -#define DRIVER_BUFFER_EXCHANGE(x...) ioctl( fd, B_MULTI_BUFFER_EXCHANGE, x ) - -#define DRIVER_LIST_MIX_CONTROLS(x...) ioctl( fd, B_MULTI_LIST_MIX_CONTROLS, x ) -#define DRIVER_SET_MIX(x...) ioctl( fd, B_MULTI_SET_MIX, x ) -#define DRIVER_GET_MIX(x...) ioctl( fd, B_MULTI_GET_MIX, x ) - -#endif