From 673ef2cbafb7291204d1cfcb79466ea7fe799beb Mon Sep 17 00:00:00 2001 From: Siarzhuk Zharski Date: Sun, 23 Jun 2013 21:05:20 +0200 Subject: [PATCH] USB audio: cleanup and codestyle fixes. * cleanup and codestyle fixes; * AudioFunction module contents purged out as unused. --- .../audio/usb_audio/AudioControlInterface.cpp | 456 ++++--- .../audio/usb_audio/AudioControlInterface.h | 253 ++-- .../drivers/audio/usb_audio/AudioFunction.cpp | 1092 ----------------- .../drivers/audio/usb_audio/AudioFunction.h | 349 ------ .../usb_audio/AudioStreamingInterface.cpp | 240 ++-- .../audio/usb_audio/AudioStreamingInterface.h | 150 ++- .../kernel/drivers/audio/usb_audio/Device.cpp | 300 ++--- .../kernel/drivers/audio/usb_audio/Device.h | 155 +-- .../kernel/drivers/audio/usb_audio/Driver.cpp | 105 +- .../kernel/drivers/audio/usb_audio/Driver.h | 29 +- .../kernel/drivers/audio/usb_audio/Jamfile | 5 +- .../drivers/audio/usb_audio/Settings.cpp | 34 +- .../kernel/drivers/audio/usb_audio/Settings.h | 10 +- .../kernel/drivers/audio/usb_audio/Stream.cpp | 195 ++- .../kernel/drivers/audio/usb_audio/Stream.h | 107 +- .../drivers/audio/usb_audio/USB_audio_spec.h | 3 +- .../kernel/drivers/audio/usb_audio/makefile | 127 -- 17 files changed, 827 insertions(+), 2783 deletions(-) delete mode 100644 src/add-ons/kernel/drivers/audio/usb_audio/AudioFunction.cpp delete mode 100644 src/add-ons/kernel/drivers/audio/usb_audio/AudioFunction.h delete mode 100644 src/add-ons/kernel/drivers/audio/usb_audio/makefile diff --git a/src/add-ons/kernel/drivers/audio/usb_audio/AudioControlInterface.cpp b/src/add-ons/kernel/drivers/audio/usb_audio/AudioControlInterface.cpp index 417a4b09be..3bf0b52f1d 100644 --- a/src/add-ons/kernel/drivers/audio/usb_audio/AudioControlInterface.cpp +++ b/src/add-ons/kernel/drivers/audio/usb_audio/AudioControlInterface.cpp @@ -1,14 +1,16 @@ /* * Driver for USB Audio Device Class devices. - * Copyright (c) 2009,10,12 S.Zharski + * Copyright (c) 2009-13 S.Zharski * Distributed under the tems of the MIT license. * */ #include "AudioControlInterface.h" -#include "Settings.h" -#include "Device.h" + #include "audio.h" +#include "Device.h" +#include "Driver.h" +#include "Settings.h" enum TerminalTypes { @@ -185,14 +187,14 @@ GetTerminalDescription(uint16 TerminalType) _AudioControl::_AudioControl(AudioControlInterface* interface, - usb_audiocontrol_header_descriptor* Header) - : - fStatus(B_NO_INIT), - fInterface(interface), - fSubType(Header->descriptor_subtype), - fID(0), - fSourceID(0), - fStringIndex(0) + usb_audiocontrol_header_descriptor* Header) + : + fStatus(B_NO_INIT), + fInterface(interface), + fSubType(Header->descriptor_subtype), + fID(0), + fSourceID(0), + fStringIndex(0) { } @@ -205,51 +207,45 @@ _AudioControl::~_AudioControl() AudioChannelCluster* _AudioControl::OutCluster() { - if (SourceID() == 0 || fInterface == NULL) { + if (SourceID() == 0 || fInterface == NULL) return NULL; - } _AudioControl* control = fInterface->Find(SourceID()); - if (control == NULL) { + if (control == NULL) return NULL; - } return control->OutCluster(); } AudioChannelCluster::AudioChannelCluster() - : - fOutChannelsNumber(0), - fChannelsConfig(0), - fChannelNames(0) + : + fOutChannelsNumber(0), + fChannelsConfig(0), + fChannelNames(0) { - } AudioChannelCluster::~AudioChannelCluster() { - } _Terminal::_Terminal(AudioControlInterface* interface, - usb_audiocontrol_header_descriptor* Header) - : - _AudioControl(interface, Header), - fTerminalType(0), - fAssociatedTerminal(0), - fClockSourceId(0), - fControlsBitmap(0) + usb_audiocontrol_header_descriptor* Header) + : + _AudioControl(interface, Header), + fTerminalType(0), + fAssociatedTerminal(0), + fClockSourceId(0), + fControlsBitmap(0) { - } _Terminal::~_Terminal() { - } @@ -268,9 +264,9 @@ _Terminal::IsUSBIO() InputTerminal::InputTerminal(AudioControlInterface* interface, - usb_audiocontrol_header_descriptor* Header) - : - _AudioChannelCluster<_Terminal>(interface, Header) + usb_audiocontrol_header_descriptor* Header) + : + _AudioChannelCluster<_Terminal>(interface, Header) { usb_input_terminal_descriptor_r1* Terminal = (usb_input_terminal_descriptor_r1*) Header; @@ -280,7 +276,7 @@ InputTerminal::InputTerminal(AudioControlInterface* interface, TRACE("Input Terminal ID:%d >>>\n", fID); TRACE("Terminal type:%s (%#06x)\n", - GetTerminalDescription(fTerminalType), fTerminalType); + GetTerminalDescription(fTerminalType), fTerminalType); TRACE("Assoc.terminal:%d\n", fAssociatedTerminal); if (fInterface->SpecReleaseNumber() < 0x200) { @@ -317,9 +313,9 @@ InputTerminal::~InputTerminal() OutputTerminal::OutputTerminal(AudioControlInterface* interface, - usb_audiocontrol_header_descriptor* Header) - : - _Terminal(interface, Header) + usb_audiocontrol_header_descriptor* Header) + : + _Terminal(interface, Header) { usb_output_terminal_descriptor_r1* Terminal = (usb_output_terminal_descriptor_r1*) Header; @@ -331,7 +327,7 @@ OutputTerminal::OutputTerminal(AudioControlInterface* interface, TRACE("Output Terminal ID:%d >>>\n", fID); TRACE("Terminal type:%s (%#06x)\n", - GetTerminalDescription(fTerminalType), fTerminalType); + GetTerminalDescription(fTerminalType), fTerminalType); TRACE("Assoc.terminal:%d\n", fAssociatedTerminal); TRACE("Source ID:%d\n", fSourceID); @@ -361,10 +357,10 @@ OutputTerminal::~OutputTerminal() MixerUnit::MixerUnit(AudioControlInterface* interface, - usb_audiocontrol_header_descriptor* Header) - : - _AudioChannelCluster<_AudioControl>(interface, Header), - fControlsBitmap(0) + usb_audiocontrol_header_descriptor* Header) + : + _AudioChannelCluster<_AudioControl>(interface, Header), + fControlsBitmap(0) { usb_mixer_unit_descriptor* Mixer = (usb_mixer_unit_descriptor*) Header; @@ -384,7 +380,7 @@ MixerUnit::MixerUnit(AudioControlInterface* interface, if (fInterface->SpecReleaseNumber() < 0x200) { usb_output_channels_descriptor_r1* OutChannels = (usb_output_channels_descriptor_r1*) - &Mixer->input_pins[Mixer->num_input_pins]; + &Mixer->input_pins[Mixer->num_input_pins]; fOutChannelsNumber = OutChannels->num_output_pins; fChannelsConfig = OutChannels->channel_config; @@ -396,7 +392,7 @@ MixerUnit::MixerUnit(AudioControlInterface* interface, } else { usb_output_channels_descriptor* OutChannels = (usb_output_channels_descriptor*) - &Mixer->input_pins[Mixer->num_input_pins]; + &Mixer->input_pins[Mixer->num_input_pins]; fOutChannelsNumber = OutChannels->num_output_pins; fChannelsConfig = OutChannels->channel_config; @@ -432,10 +428,10 @@ MixerUnit::~MixerUnit() SelectorUnit::SelectorUnit(AudioControlInterface* interface, - usb_audiocontrol_header_descriptor* Header) - : - _AudioControl(interface, Header), - fControlsBitmap(0) + usb_audiocontrol_header_descriptor* Header) + : + _AudioControl(interface, Header), + fControlsBitmap(0) { usb_selector_unit_descriptor* Selector = (usb_selector_unit_descriptor*) Header; @@ -450,10 +446,8 @@ SelectorUnit::SelectorUnit(AudioControlInterface* interface, } if (fInterface->SpecReleaseNumber() < 0x200) { - fStringIndex = Selector->input_pins[Selector->num_input_pins]; } else { - fControlsBitmap = Selector->input_pins[Selector->num_input_pins]; fStringIndex = Selector->input_pins[Selector->num_input_pins + 1]; @@ -474,19 +468,16 @@ SelectorUnit::~SelectorUnit() AudioChannelCluster* SelectorUnit::OutCluster() { - if (fInterface == NULL) { + if (fInterface == NULL) return NULL; - } for (int i = 0; i < fInputPins.Count(); i++) { _AudioControl* control = fInterface->Find(fInputPins[i]); - if (control == NULL) { + if (control == NULL) continue; - } - if (control->OutCluster() != NULL) { + if (control->OutCluster() != NULL) return control->OutCluster(); - } } return NULL; @@ -494,9 +485,9 @@ SelectorUnit::OutCluster() FeatureUnit::FeatureUnit(AudioControlInterface* interface, - usb_audiocontrol_header_descriptor* Header) - : - _AudioControl(interface, Header) + usb_audiocontrol_header_descriptor* Header) + : + _AudioControl(interface, Header) { usb_feature_unit_descriptor* Feature = (usb_feature_unit_descriptor*) Header; @@ -509,11 +500,11 @@ FeatureUnit::FeatureUnit(AudioControlInterface* interface, uint8 controlSize = 4; uint8 channelsCount = (Feature->length - 6) / controlSize; - uint8 *ControlsBitmapPointer = (uint8*)&Feature->bma_controls[0]; + uint8* ControlsBitmapPointer = (uint8*)&Feature->bma_controls[0]; if (fInterface->SpecReleaseNumber() < 0x200) { usb_feature_unit_descriptor_r1* Feature - = (usb_feature_unit_descriptor_r1*) Header; + = (usb_feature_unit_descriptor_r1*)Header; controlSize = Feature->control_size; channelsCount = (Feature->length - 7) / Feature->control_size; ControlsBitmapPointer = &Feature->bma_controls[0]; @@ -523,7 +514,7 @@ FeatureUnit::FeatureUnit(AudioControlInterface* interface, TRACE("Channels number:%d\n", channelsCount - 1); // not add master! for (size_t i = 0; i < channelsCount; i++) { - uint8 *controlPointer = &ControlsBitmapPointer[i * controlSize]; + uint8* controlPointer = &ControlsBitmapPointer[i* controlSize]; switch(controlSize) { case 1: fControlBitmaps.PushBack(*controlPointer); break; case 2: fControlBitmaps.PushBack(*(uint16*)controlPointer); break; @@ -537,7 +528,7 @@ FeatureUnit::FeatureUnit(AudioControlInterface* interface, NormalizeAndTraceChannel(i); } - fStringIndex = ControlsBitmapPointer[channelsCount * controlSize]; + fStringIndex = ControlsBitmapPointer[channelsCount* controlSize]; TRACE("StringIndex:%d\n", fStringIndex); fStatus = B_OK; @@ -553,9 +544,8 @@ const char* FeatureUnit::Name() { // first check if source of this FU is an input terminal - _AudioControl *control = fInterface->Find(fSourceID); + _AudioControl* control = fInterface->Find(fSourceID); while (control != 0) { - if (control->SubType() != IDSInputTerminal) break; @@ -570,7 +560,6 @@ FeatureUnit::Name() // check if output of this FU is connected to output terminal control = fInterface->FindOutputTerminal(fID); while (control != 0) { - if (control->SubType() != IDSOutputTerminal) break; @@ -591,7 +580,7 @@ FeatureUnit::HasControl(int32 Channel, uint32 Control) { if (Channel >= fControlBitmaps.Count()) { TRACE_ALWAYS("Out of limits error of retrieving control %#010x " - "for channel %d\n", Control, Channel); + "for channel %d\n", Control, Channel); return false; } @@ -640,9 +629,8 @@ FeatureUnit::NormalizeAndTraceChannel(int32 Channel) for (size_t i = 0; i < _countof(remapInfos); i++) { uint32 bits = isRev1 ? remapInfos[i].rev1Bits : remapInfos[i].rev2Bits; if ((fControlBitmaps[Channel] & bits) > 0) { - if (isRev1) { + if (isRev1) remappedBitmap |= remapInfos[i].rev2Bits; - } TRACE("\t%s\n", remapInfos[i].name); } } @@ -655,9 +643,9 @@ FeatureUnit::NormalizeAndTraceChannel(int32 Channel) EffectUnit::EffectUnit(AudioControlInterface* interface, - usb_audiocontrol_header_descriptor* Header) - : - _AudioControl(interface, Header) + usb_audiocontrol_header_descriptor* Header) + : + _AudioControl(interface, Header) { usb_input_terminal_descriptor* D = (usb_input_terminal_descriptor*) Header; @@ -671,11 +659,11 @@ EffectUnit::~EffectUnit() ProcessingUnit::ProcessingUnit(AudioControlInterface* interface, - usb_audiocontrol_header_descriptor* Header) - : - _AudioChannelCluster<_AudioControl>(interface, Header), - fProcessType(0), - fControlsBitmap(0) + usb_audiocontrol_header_descriptor* Header) + : + _AudioChannelCluster<_AudioControl>(interface, Header), + fProcessType(0), + fControlsBitmap(0) { usb_processing_unit_descriptor* Processing = (usb_processing_unit_descriptor*) Header; @@ -695,7 +683,7 @@ ProcessingUnit::ProcessingUnit(AudioControlInterface* interface, if (fInterface->SpecReleaseNumber() < 0x200) { usb_output_channels_descriptor_r1* OutChannels = (usb_output_channels_descriptor_r1*) - &Processing->input_pins[Processing->num_input_pins]; + &Processing->input_pins[Processing->num_input_pins]; fOutChannelsNumber = OutChannels->num_output_pins; fChannelsConfig = OutChannels->channel_config; @@ -703,7 +691,7 @@ ProcessingUnit::ProcessingUnit(AudioControlInterface* interface, } else { usb_output_channels_descriptor* OutChannels = (usb_output_channels_descriptor*) - &Processing->input_pins[Processing->num_input_pins]; + &Processing->input_pins[Processing->num_input_pins]; fOutChannelsNumber = OutChannels->num_output_pins; fChannelsConfig = OutChannels->channel_config; @@ -738,11 +726,11 @@ ProcessingUnit::~ProcessingUnit() ExtensionUnit::ExtensionUnit(AudioControlInterface* interface, - usb_audiocontrol_header_descriptor* Header) - : - _AudioChannelCluster<_AudioControl>(interface, Header), - fExtensionCode(0), - fControlsBitmap(0) + usb_audiocontrol_header_descriptor* Header) + : + _AudioChannelCluster<_AudioControl>(interface, Header), + fExtensionCode(0), + fControlsBitmap(0) { usb_extension_unit_descriptor* Extension = (usb_extension_unit_descriptor*) Header; @@ -762,7 +750,7 @@ ExtensionUnit::ExtensionUnit(AudioControlInterface* interface, if (fInterface->SpecReleaseNumber() < 0x200) { usb_output_channels_descriptor_r1* OutChannels = (usb_output_channels_descriptor_r1*) - &Extension->input_pins[Extension->num_input_pins]; + &Extension->input_pins[Extension->num_input_pins]; fOutChannelsNumber = OutChannels->num_output_pins; fChannelsConfig = OutChannels->channel_config; @@ -770,7 +758,7 @@ ExtensionUnit::ExtensionUnit(AudioControlInterface* interface, } else { usb_output_channels_descriptor* OutChannels = (usb_output_channels_descriptor*) - &Extension->input_pins[Extension->num_input_pins]; + &Extension->input_pins[Extension->num_input_pins]; fOutChannelsNumber = OutChannels->num_output_pins; fChannelsConfig = OutChannels->channel_config; @@ -805,9 +793,9 @@ ExtensionUnit::~ExtensionUnit() ClockSource::ClockSource(AudioControlInterface* interface, - usb_audiocontrol_header_descriptor* Header) - : - _AudioControl(interface, Header) + usb_audiocontrol_header_descriptor* Header) + : + _AudioControl(interface, Header) { usb_input_terminal_descriptor* D = (usb_input_terminal_descriptor*) Header; @@ -821,9 +809,9 @@ ClockSource::~ClockSource() ClockSelector::ClockSelector(AudioControlInterface* interface, - usb_audiocontrol_header_descriptor* Header) - : - _AudioControl(interface, Header) + usb_audiocontrol_header_descriptor* Header) + : + _AudioControl(interface, Header) { usb_input_terminal_descriptor* D = (usb_input_terminal_descriptor*) Header; @@ -837,9 +825,9 @@ ClockSelector::~ClockSelector() ClockMultiplier::ClockMultiplier(AudioControlInterface* interface, - usb_audiocontrol_header_descriptor* Header) - : - _AudioControl(interface, Header) + usb_audiocontrol_header_descriptor* Header) + : + _AudioControl(interface, Header) { usb_input_terminal_descriptor* D = (usb_input_terminal_descriptor*) Header; @@ -853,9 +841,9 @@ ClockMultiplier::~ClockMultiplier() SampleRateConverter::SampleRateConverter(AudioControlInterface* interface, - usb_audiocontrol_header_descriptor* Header) - : - _AudioControl(interface, Header) + usb_audiocontrol_header_descriptor* Header) + : + _AudioControl(interface, Header) { usb_input_terminal_descriptor* D = (usb_input_terminal_descriptor*) Header; @@ -869,13 +857,13 @@ SampleRateConverter::~SampleRateConverter() AudioControlInterface::AudioControlInterface(Device* device) - : - fInterface(0), - fStatus(B_NO_INIT), - fADCSpecification(0), - fFunctionCategory(0), - fControlsBitmap(0), - fDevice(device) + : + fInterface(0), + fStatus(B_NO_INIT), + fADCSpecification(0), + fFunctionCategory(0), + fControlsBitmap(0), + fDevice(device) { } @@ -883,9 +871,8 @@ AudioControlInterface::AudioControlInterface(Device* device) AudioControlInterface::~AudioControlInterface() { for (AudioControlsIterator I = fAudioControls.Begin(); - I != fAudioControls.End(); I++) { + I != fAudioControls.End(); I++) delete I->Value(); - } fAudioControls.MakeEmpty(); @@ -898,11 +885,11 @@ AudioControlInterface::~AudioControlInterface() status_t -AudioControlInterface::Init(size_t interface, usb_interface_info *Interface) +AudioControlInterface::Init(size_t interface, usb_interface_info* Interface) { for (size_t i = 0; i < Interface->generic_count; i++) { - usb_audiocontrol_header_descriptor *Header - = (usb_audiocontrol_header_descriptor *)Interface->generic[i]; + usb_audiocontrol_header_descriptor* Header + = (usb_audiocontrol_header_descriptor* )Interface->generic[i]; if (Header->descriptor_type != AC_CS_INTERFACE) { TRACE_ALWAYS("Ignore Audio Control of " @@ -910,7 +897,7 @@ AudioControlInterface::Init(size_t interface, usb_interface_info *Interface) continue; } - _AudioControl *control = NULL; + _AudioControl* control = NULL; switch(Header->descriptor_subtype) { default: @@ -978,9 +965,8 @@ AudioControlInterface::Init(size_t interface, usb_interface_info *Interface) } fAudioControls.Put(control->ID(), control); - } else { + } else delete control; - } } return fStatus = B_OK; @@ -1003,11 +989,10 @@ AudioControlInterface::FindOutputTerminal(uint8 id) status_t AudioControlInterface::InitACHeader(size_t interface, - usb_audiocontrol_header_descriptor* Header) + usb_audiocontrol_header_descriptor* Header) { - if (Header == NULL) { + if (Header == NULL) return fStatus = B_NO_INIT; - } fInterface = interface; @@ -1034,11 +1019,10 @@ AudioControlInterface::InitACHeader(size_t interface, } - uint32 +uint32 AudioControlInterface::GetChannelsDescription( - Vector& Channels, - multi_description *Description, - AudioControlsVector &Terminals) + Vector& Channels, multi_description* Description, + Vector<_AudioControl*>&Terminals) { uint32 addedChannels = 0; // multi_channel_info* Channels = Description->channels; @@ -1070,8 +1054,7 @@ AudioControlInterface::GetChannelsDescription( uint32 AudioControlInterface::GetTerminalChannels(Vector& Channels, - AudioChannelCluster* cluster, channel_kind kind, - uint32 connectors) + AudioChannelCluster* cluster, channel_kind kind, uint32 connectors) { if (cluster->ChannelsCount() < 2) { // mono channel multi_channel_info info; @@ -1132,16 +1115,14 @@ AudioControlInterface::GetTerminalChannels(Vector& Channels, uint32 AudioControlInterface::GetBusChannelsDescription( - Vector& Channels, - multi_description *Description) + Vector& Channels, multi_description* Description) { uint32 addedChannels = 0; // multi_channel_info* Channels = Description->channels; // first iterate output channels for (AudioControlsIterator I = fOutputTerminals.Begin(); - I != fOutputTerminals.End(); I++) { - + I != fOutputTerminals.End(); I++) { _AudioControl* control = I->Value(); if (static_cast<_Terminal*>(control)->IsUSBIO()) continue; @@ -1162,8 +1143,7 @@ AudioControlInterface::GetBusChannelsDescription( // output channels should follow too for (AudioControlsIterator I = fInputTerminals.Begin(); - I != fInputTerminals.End(); I++) { - + I != fInputTerminals.End(); I++) { _AudioControl* control = I->Value(); if (static_cast<_Terminal*>(control)->IsUSBIO()) continue; @@ -1188,7 +1168,7 @@ AudioControlInterface::GetBusChannelsDescription( void AudioControlInterface::_HarvestRecordFeatureUnits(_AudioControl* rootControl, - AudioControlsMap& Map) + AudioControlsMap& Map) { if (rootControl == 0) { TRACE_ALWAYS("Not processing due NULL root control.\n"); @@ -1203,9 +1183,8 @@ AudioControlInterface::_HarvestRecordFeatureUnits(_AudioControl* rootControl, case IDSSelectorUnit: { SelectorUnit* unit = static_cast(rootControl); - for (int i = 0; i < unit->fInputPins.Count(); i++) { + for (int i = 0; i < unit->fInputPins.Count(); i++) _HarvestRecordFeatureUnits(Find(unit->fInputPins[i]), Map); - } Map.Put(rootControl->ID(), rootControl); } @@ -1238,14 +1217,14 @@ AudioControlInterface::_InitGainLimits(multi_mix_control& Control) size_t actualLength = 0; for (size_t i = 0; i < _countof(gainInfos); i++) { status_t status = gUSBModule->send_request(fDevice->USBDevice(), - USB_REQTYPE_INTERFACE_IN | USB_REQTYPE_CLASS, - gainInfos[i].request, REQ_VALUE(Control.id), - REQ_INDEX(Control.id), sizeof(gainInfos[i].data), - &gainInfos[i].data, &actualLength); + USB_REQTYPE_INTERFACE_IN | USB_REQTYPE_CLASS, + gainInfos[i].request, REQ_VALUE(Control.id), + REQ_INDEX(Control.id), sizeof(gainInfos[i].data), + &gainInfos[i].data, &actualLength); if (status != B_OK || actualLength != sizeof(gainInfos[i].data)) { TRACE_ALWAYS("Request %d failed:%#08x; received %d of %d\n", - i, status, actualLength, sizeof(gainInfos[i].data)); + i, status, actualLength, sizeof(gainInfos[i].data)); continue; } @@ -1253,16 +1232,14 @@ AudioControlInterface::_InitGainLimits(multi_mix_control& Control) } TRACE_ALWAYS("Control %s: from %f to %f dB, step %f dB.\n", Control.name, - Control.gain.min_gain, Control.gain.max_gain, - Control.gain.granularity); + Control.gain.min_gain, Control.gain.max_gain, Control.gain.granularity); } uint32 AudioControlInterface::_ListFeatureUnitOption(uint32 controlType, - int32& index, int32 parentIndex, - multi_mix_control_info* Info, FeatureUnit* unit, - uint32 channel, uint32 channels) + int32& index, int32 parentIndex, multi_mix_control_info* Info, + FeatureUnit* unit, uint32 channel, uint32 channels) { int32 startIndex = index; uint32 id = 0; @@ -1296,11 +1273,11 @@ AudioControlInterface::_ListFeatureUnitOption(uint32 controlType, multi_mix_control* Controls = Info->controls; if (unit->HasControl(channel, controlType)) { - uint32 masterIndex - = Controls[index].id = CTL_ID(id, channel, unit->ID(), fInterface); - Controls[index].flags = flags; - Controls[index].parent = parentIndex; - Controls[index].string = string; + uint32 masterIndex = CTL_ID(id, channel, unit->ID(), fInterface); + Controls[index].id = masterIndex; + Controls[index].flags = flags; + Controls[index].parent = parentIndex; + Controls[index].string = string; if (name != NULL) strlcpy(Controls[index].name, name, sizeof(Controls[index].name)); if (initGainLimits) @@ -1309,15 +1286,13 @@ AudioControlInterface::_ListFeatureUnitOption(uint32 controlType, index++; if (channels == 2) { - Controls[index].id = CTL_ID(id, channel + 1, - unit->ID(), fInterface); - Controls[index].flags = flags; - Controls[index].parent = parentIndex; - Controls[index].master = masterIndex; - Controls[index].string = string; + Controls[index].id = CTL_ID(id, channel + 1, unit->ID(), fInterface); + Controls[index].flags = flags; + Controls[index].parent = parentIndex; + Controls[index].master = masterIndex; + Controls[index].string = string; if (name != NULL) - strlcpy(Controls[index].name, name, - sizeof(Controls[index].name)); + strlcpy(Controls[index].name, name, sizeof(Controls[index].name)); if (initGainLimits) _InitGainLimits(Controls[index]); index++; @@ -1330,7 +1305,7 @@ AudioControlInterface::_ListFeatureUnitOption(uint32 controlType, int32 AudioControlInterface::_ListFeatureUnitControl(int32& index, int32 parentIndex, - multi_mix_control_info* Info, _AudioControl* control) + multi_mix_control_info* Info, _AudioControl* control) { FeatureUnit* unit = static_cast(control); if (unit == 0) { @@ -1391,12 +1366,12 @@ AudioControlInterface::_ListFeatureUnitControl(int32& index, int32 parentIndex, } if (masterIndex == 0) { - groupIndex - = Controls[index].id = index; - Controls[index].flags = B_MULTI_MIX_GROUP; - Controls[index].parent = parentIndex; + groupIndex = index; + Controls[index].id = groupIndex; + Controls[index].flags = B_MULTI_MIX_GROUP; + Controls[index].parent = parentIndex; snprintf(Controls[index].name, sizeof(Controls[index].name), - "%s %s", unit->Name(), channelInfos[i].Name); + "%s %s", unit->Name(), channelInfos[i].Name); index++; } else { groupIndex = masterIndex; @@ -1405,19 +1380,18 @@ AudioControlInterface::_ListFeatureUnitControl(int32& index, int32 parentIndex, // First list possible Mute controls _ListFeatureUnitOption(MuteControl, index, groupIndex, Info, - unit, channel, channelInfos[i].channels); + unit, channel, channelInfos[i].channels); // Gain controls may be usefull too if (_ListFeatureUnitOption(VolumeControl, index, groupIndex, Info, - unit, channel, channelInfos[i].channels) == 0) - { + unit, channel, channelInfos[i].channels) == 0) { masterIndex = (i == 0) ? groupIndex : 0 ; TRACE("channel:%d set master index to %d\n", channel, masterIndex); } // Auto Gain checkbox will be listed too _ListFeatureUnitOption(AutoGainControl, index, groupIndex, Info, - unit, channel, channelInfos[i].channels); + unit, channel, channelInfos[i].channels); // Now check if the group filled with something usefull. // In case no controls were added into it - "remove" it @@ -1439,10 +1413,9 @@ AudioControlInterface::_ListFeatureUnitControl(int32& index, int32 parentIndex, break; } - if (channelsConfig > 0) { - TRACE_ALWAYS("Following channels were " - "not processed: %#08x.\n", channelsConfig); - } + if (channelsConfig > 0) + TRACE_ALWAYS("Following channels were not processed: %#08x.\n", + channelsConfig); // return last group index to stick possible selector unit to it. ;-) return groupIndex; @@ -1451,53 +1424,49 @@ AudioControlInterface::_ListFeatureUnitControl(int32& index, int32 parentIndex, void AudioControlInterface::_ListSelectorUnitControl(int32& index, int32 parentGroup, - multi_mix_control_info* Info, _AudioControl* control) + multi_mix_control_info* Info, _AudioControl* control) { SelectorUnit* selector = static_cast(control); - if (selector == 0 || selector->SubType() != IDSSelectorUnit) { + if (selector == 0 || selector->SubType() != IDSSelectorUnit) return; - } multi_mix_control* Controls = Info->controls; - int32 recordMUX - = Controls[index].id = CTL_ID(0, 0, selector->ID(), fInterface); - Controls[index].flags = B_MULTI_MIX_MUX; - Controls[index].parent = parentGroup; - Controls[index].string = S_null; + int32 recordMUX = CTL_ID(0, 0, selector->ID(), fInterface); + Controls[index].id = recordMUX; + Controls[index].flags = B_MULTI_MIX_MUX; + Controls[index].parent = parentGroup; + Controls[index].string = S_null; strlcpy(Controls[index].name, "Source", sizeof(Controls[index].name)); index++; for (int i = 0; i < selector->fInputPins.Count(); i++) { - Controls[index].id = CTL_ID(0, 1, selector->ID(), fInterface); - Controls[index].flags = B_MULTI_MIX_MUX_VALUE; - Controls[index].master = 0; - Controls[index].string = S_null; - Controls[index].parent = recordMUX; + Controls[index].id = CTL_ID(0, 1, selector->ID(), fInterface); + Controls[index].flags = B_MULTI_MIX_MUX_VALUE; + Controls[index].master = 0; + Controls[index].string = S_null; + Controls[index].parent = recordMUX; _AudioControl* control = Find(selector->fInputPins[i]); - if (control != NULL) { + if (control != NULL) strlcpy(Controls[index].name, - control->Name(), sizeof(Controls[index].name)); - } else { + control->Name(), sizeof(Controls[index].name)); + else snprintf(Controls[index].name, - sizeof(Controls[index].name), "Input #%d", i + 1); - } + sizeof(Controls[index].name), "Input #%d", i + 1); index++; } - } void AudioControlInterface::_ListMixControlsPage(int32& index, - multi_mix_control_info* Info, - AudioControlsMap& Map, const char* Name) + multi_mix_control_info* Info, AudioControlsMap& Map, const char* Name) { multi_mix_control* Controls = Info->controls; - int32 groupIndex - = Controls[index].id = index | 0x10000; - Controls[index].flags = B_MULTI_MIX_GROUP; - Controls[index].parent = 0; + int32 groupIndex = index | 0x10000; + Controls[index].id = groupIndex; + Controls[index].flags = B_MULTI_MIX_GROUP; + Controls[index].parent = 0; strlcpy(Controls[index].name, Name, sizeof(Controls[index].name)); index++; @@ -1507,7 +1476,7 @@ AudioControlInterface::_ListMixControlsPage(int32& index, switch(I->Value()->SubType()) { case IDSFeatureUnit: group = _ListFeatureUnitControl(index, groupIndex, - Info, I->Value()); + Info, I->Value()); break; case IDSSelectorUnit: _ListSelectorUnitControl(index, group, Info, I->Value()); @@ -1524,61 +1493,51 @@ AudioControlInterface::ListMixControls(multi_mix_control_info* Info) AudioControlsMap RecordControlsMap; for (AudioControlsIterator I = fOutputTerminals.Begin(); - I != fOutputTerminals.End(); I++) - { + I != fOutputTerminals.End(); I++) { _Terminal* terminal = static_cast<_Terminal*>(I->Value()); - if (terminal->IsUSBIO()) { + if (terminal->IsUSBIO()) _HarvestRecordFeatureUnits(terminal, RecordControlsMap); - } } AudioControlsMap InputControlsMap; AudioControlsMap OutputControlsMap; for (AudioControlsIterator I = fAudioControls.Begin(); - I != fAudioControls.End(); I++) - { + I != fAudioControls.End(); I++) { _AudioControl* control = I->Value(); // filter out feature units - if (control->SubType() != IDSFeatureUnit) { + if (control->SubType() != IDSFeatureUnit) continue; - } // ignore controls that are already in the record controls map - if (RecordControlsMap.Find(control->ID()) != RecordControlsMap.End()) { + if (RecordControlsMap.Find(control->ID()) != RecordControlsMap.End()) continue; - } _AudioControl* sourceControl = Find(control->SourceID()); - if (sourceControl != 0 && sourceControl->SubType() == IDSInputTerminal) { + if (sourceControl != 0 && sourceControl->SubType() == IDSInputTerminal) InputControlsMap.Put(control->ID(), control); - } else { + else OutputControlsMap.Put(control->ID(), control); - } } int32 index = 0; - if (InputControlsMap.Count() > 0) { + if (InputControlsMap.Count() > 0) _ListMixControlsPage(index, Info, InputControlsMap, "Input"); - } - if (OutputControlsMap.Count() > 0) { + if (OutputControlsMap.Count() > 0) _ListMixControlsPage(index, Info, OutputControlsMap, "Output"); - } - if (RecordControlsMap.Count() > 0) { + if (RecordControlsMap.Count() > 0) _ListMixControlsPage(index, Info, RecordControlsMap, "Record"); - } return B_OK; } status_t -AudioControlInterface::GetMix(multi_mix_value_info *Info) +AudioControlInterface::GetMix(multi_mix_value_info* Info) { for (int32 i = 0; i < Info->item_count; i++) { - uint16 length = 0; int16 data = 0; switch(CS_FROM_CTLID(Info->values[i].id)) { @@ -1592,19 +1551,19 @@ AudioControlInterface::GetMix(multi_mix_value_info *Info) break; default: TRACE_ALWAYS("Unsupported control type %#02x ignored.\n", - CS_FROM_CTLID(Info->values[i].id)); + CS_FROM_CTLID(Info->values[i].id)); continue; } size_t actualLength = 0; status_t status = gUSBModule->send_request(fDevice->USBDevice(), - USB_REQTYPE_INTERFACE_IN | USB_REQTYPE_CLASS, UAS_GET_CUR, - REQ_VALUE(Info->values[i].id), REQ_INDEX(Info->values[i].id), - length, &data, &actualLength); + USB_REQTYPE_INTERFACE_IN | USB_REQTYPE_CLASS, UAS_GET_CUR, + REQ_VALUE(Info->values[i].id), REQ_INDEX(Info->values[i].id), + length, &data, &actualLength); if (status != B_OK || actualLength != length) { TRACE_ALWAYS("Request failed:%#08x; received %d of %d\n", - status, actualLength, length); + status, actualLength, length); continue; } @@ -1612,29 +1571,29 @@ AudioControlInterface::GetMix(multi_mix_value_info *Info) case UAS_VOLUME_CONTROL: Info->values[i].gain = static_cast(data) / 256.; TRACE("Gain control %d; channel: %d; is %f dB.\n", - ID_FROM_CTLID(Info->values[i].id), - CN_FROM_CTLID(Info->values[i].id), - Info->values[i].gain); + ID_FROM_CTLID(Info->values[i].id), + CN_FROM_CTLID(Info->values[i].id), + Info->values[i].gain); break; case UAS_MUTE_CONTROL: Info->values[i].enable = data > 0; TRACE("Mute control %d; channel: %d; is %d.\n", - ID_FROM_CTLID(Info->values[i].id), - CN_FROM_CTLID(Info->values[i].id), - Info->values[i].enable); + ID_FROM_CTLID(Info->values[i].id), + CN_FROM_CTLID(Info->values[i].id), + Info->values[i].enable); break; case UAS_AUTOMATIC_GAIN_CONTROL: Info->values[i].enable = data > 0; TRACE("AGain control %d; channel: %d; is %d.\n", - ID_FROM_CTLID(Info->values[i].id), - CN_FROM_CTLID(Info->values[i].id), - Info->values[i].enable); + ID_FROM_CTLID(Info->values[i].id), + CN_FROM_CTLID(Info->values[i].id), + Info->values[i].enable); break; case 0: // Selector Unit Info->values[i].mux = data; TRACE("Selector control %d; is %d.\n", - ID_FROM_CTLID(Info->values[i].id), - Info->values[i].mux); + ID_FROM_CTLID(Info->values[i].id), + Info->values[i].mux); break; default: break; @@ -1646,10 +1605,9 @@ AudioControlInterface::GetMix(multi_mix_value_info *Info) status_t -AudioControlInterface::SetMix(multi_mix_value_info *Info) +AudioControlInterface::SetMix(multi_mix_value_info* Info) { for (int32 i = 0; i < Info->item_count; i++) { - uint16 length = 0; int16 data = 0; @@ -1658,48 +1616,48 @@ AudioControlInterface::SetMix(multi_mix_value_info *Info) data = static_cast(Info->values[i].gain * 256.); length = 2; TRACE("Gain control %d; channel: %d; about to set to %f dB.\n", - ID_FROM_CTLID(Info->values[i].id), - CN_FROM_CTLID(Info->values[i].id), - Info->values[i].gain); + ID_FROM_CTLID(Info->values[i].id), + CN_FROM_CTLID(Info->values[i].id), + Info->values[i].gain); break; case UAS_MUTE_CONTROL: data = (Info->values[i].enable ? 1 : 0); length = 1; TRACE("Mute control %d; channel: %d; about to set to %d.\n", - ID_FROM_CTLID(Info->values[i].id), - CN_FROM_CTLID(Info->values[i].id), - Info->values[i].enable); + ID_FROM_CTLID(Info->values[i].id), + CN_FROM_CTLID(Info->values[i].id), + Info->values[i].enable); break; case UAS_AUTOMATIC_GAIN_CONTROL: data = (Info->values[i].enable ? 1 : 0); length = 1; TRACE("AGain control %d; channel: %d; about to set to %d.\n", - ID_FROM_CTLID(Info->values[i].id), - CN_FROM_CTLID(Info->values[i].id), - Info->values[i].enable); + ID_FROM_CTLID(Info->values[i].id), + CN_FROM_CTLID(Info->values[i].id), + Info->values[i].enable); break; case 0: // Selector Unit data = Info->values[i].mux; length = 1; TRACE("Selector Control %d about to set to %d.\n", - ID_FROM_CTLID(Info->values[i].id), - Info->values[i].mux); + ID_FROM_CTLID(Info->values[i].id), + Info->values[i].mux); break; default: TRACE_ALWAYS("Unsupported control type %#02x ignored.\n", - CS_FROM_CTLID(Info->values[i].id)); + CS_FROM_CTLID(Info->values[i].id)); continue; } size_t actualLength = 0; status_t status = gUSBModule->send_request(fDevice->USBDevice(), - USB_REQTYPE_INTERFACE_OUT | USB_REQTYPE_CLASS, UAS_SET_CUR, - REQ_VALUE(Info->values[i].id), REQ_INDEX(Info->values[i].id), - length, &data, &actualLength); + USB_REQTYPE_INTERFACE_OUT | USB_REQTYPE_CLASS, UAS_SET_CUR, + REQ_VALUE(Info->values[i].id), REQ_INDEX(Info->values[i].id), + length, &data, &actualLength); if (status != B_OK || actualLength != length) { TRACE_ALWAYS("Request failed:%#08x; send %d of %d\n", - status, actualLength, length); + status, actualLength, length); continue; } diff --git a/src/add-ons/kernel/drivers/audio/usb_audio/AudioControlInterface.h b/src/add-ons/kernel/drivers/audio/usb_audio/AudioControlInterface.h index 967351ebd9..016f864f05 100644 --- a/src/add-ons/kernel/drivers/audio/usb_audio/AudioControlInterface.h +++ b/src/add-ons/kernel/drivers/audio/usb_audio/AudioControlInterface.h @@ -1,6 +1,6 @@ /* * Driver for USB Audio Device Class devices. - * Copyright (c) 2009,10,12 S.Zharski + * Copyright (c) 2009-13 S.Zharski * Distributed under the terms of the MIT license. * */ @@ -8,97 +8,100 @@ #define _AUDIO_CONTROL_INTERFACE_H_ -#include - -#include "Driver.h" #include "USB_audio_spec.h" +#include + +#include +#include +class Device; class AudioControlInterface; +class _AudioControl; +typedef VectorMap AudioControlsMap; +typedef VectorMap::Iterator AudioControlsIterator; + class AudioChannelCluster { public: - AudioChannelCluster(); - virtual ~AudioChannelCluster(); + AudioChannelCluster(); + virtual ~AudioChannelCluster(); - uint8 ChannelsCount() { return fOutChannelsNumber; } - uint32 ChannelsConfig() { return fChannelsConfig; } + uint8 ChannelsCount() { return fOutChannelsNumber; } + uint32 ChannelsConfig() { return fChannelsConfig; } protected: - uint8 fOutChannelsNumber; - uint32 fChannelsConfig; - uint8 fChannelNames; + uint8 fOutChannelsNumber; + uint32 fChannelsConfig; + uint8 fChannelNames; }; -template< class __base_class_name > -class _AudioChannelCluster - : public __base_class_name, public AudioChannelCluster { +template +class _AudioChannelCluster : public __base_class_name, + public AudioChannelCluster { public: - _AudioChannelCluster(AudioControlInterface* interface, + _AudioChannelCluster(AudioControlInterface* interface, usb_audiocontrol_header_descriptor* Header) : __base_class_name(interface, Header) {} - virtual ~_AudioChannelCluster() {} - - virtual AudioChannelCluster* - OutCluster() { return this; } + virtual ~_AudioChannelCluster() {} + virtual AudioChannelCluster* + OutCluster() { return this; } }; -// -// base class for Audio Controls (Units and Terminals) -// -// class _AudioControl { public: _AudioControl(AudioControlInterface* interface, usb_audiocontrol_header_descriptor* Header); - virtual ~_AudioControl(); + virtual ~_AudioControl(); - uint8 ID() { return fID; } - uint8 SourceID() { return fSourceID; } - uint8 SubType() { return fSubType; } - status_t InitCheck() { return fStatus; }; -virtual const char* Name() { return ""; } -virtual AudioChannelCluster* OutCluster(); + uint8 ID() { return fID; } + uint8 SourceID() { return fSourceID; } + uint8 SubType() { return fSubType; } + status_t InitCheck() { return fStatus; }; + + virtual const char* Name() { return ""; } + + virtual AudioChannelCluster* + OutCluster(); protected: - // state tracking - status_t fStatus; - AudioControlInterface* fInterface; - uint8 fSubType; - uint8 fID; - uint8 fSourceID; - uint8 fStringIndex; + status_t fStatus; + AudioControlInterface* fInterface; + uint8 fSubType; + uint8 fID; + uint8 fSourceID; + uint8 fStringIndex; }; - class _Terminal : public _AudioControl { public: _Terminal(AudioControlInterface* interface, usb_audiocontrol_header_descriptor* Header); - virtual ~_Terminal(); + virtual ~_Terminal(); - uint16 TerminalType() { return fTerminalType; } - bool IsUSBIO(); -virtual const char* Name(); + uint16 TerminalType() { return fTerminalType; } + bool IsUSBIO(); + virtual const char* Name(); protected: - uint16 fTerminalType; - uint8 fAssociatedTerminal; - uint8 fClockSourceId; - uint16 fControlsBitmap; + uint16 fTerminalType; + uint8 fAssociatedTerminal; + uint8 fClockSourceId; + uint16 fControlsBitmap; }; + class InputTerminal : public _AudioChannelCluster<_Terminal> { public: InputTerminal(AudioControlInterface* interface, usb_audiocontrol_header_descriptor* Header); - virtual ~InputTerminal(); + virtual ~InputTerminal(); protected: }; @@ -108,7 +111,7 @@ class OutputTerminal : public _Terminal { public: OutputTerminal(AudioControlInterface* interface, usb_audiocontrol_header_descriptor* Header); - virtual ~OutputTerminal(); + virtual ~OutputTerminal(); protected: }; @@ -118,12 +121,12 @@ class MixerUnit : public _AudioChannelCluster<_AudioControl> { public: MixerUnit(AudioControlInterface* interface, usb_audiocontrol_header_descriptor* Header); - virtual ~MixerUnit(); + virtual ~MixerUnit(); protected: - Vector fInputPins; - Vector fProgrammableControls; - uint8 fControlsBitmap; + Vector fInputPins; + Vector fProgrammableControls; + uint8 fControlsBitmap; }; @@ -131,12 +134,14 @@ class SelectorUnit : public _AudioControl { public: SelectorUnit(AudioControlInterface* interface, usb_audiocontrol_header_descriptor* Header); - virtual ~SelectorUnit(); + virtual ~SelectorUnit(); + + virtual AudioChannelCluster* + OutCluster(); -virtual AudioChannelCluster* OutCluster(); // protected: - Vector fInputPins; - uint8 fControlsBitmap; + Vector fInputPins; + uint8 fControlsBitmap; }; @@ -144,29 +149,29 @@ class FeatureUnit : public _AudioControl { public: FeatureUnit(AudioControlInterface* interface, usb_audiocontrol_header_descriptor* Header); - virtual ~FeatureUnit(); + virtual ~FeatureUnit(); -virtual const char* Name(); - bool HasControl(int32 Channel, uint32 Control); + virtual const char* Name(); + bool HasControl(int32 Channel, uint32 Control); // protected: - void NormalizeAndTraceChannel(int32 Channel); + void NormalizeAndTraceChannel(int32 Channel); - Vector fControlBitmaps; + Vector fControlBitmaps; }; -class EffectUnit : public _AudioControl/*, public _AudioChannelsCluster*/ { +class EffectUnit : public _AudioControl { public: EffectUnit(AudioControlInterface* interface, usb_audiocontrol_header_descriptor* Header); - virtual ~EffectUnit(); + virtual ~EffectUnit(); protected: -/* uint16 fProcessType; - Vector fInputPins; - uint8 fControlsBitmap; - Vector fModes; +/* uint16 fProcessType; + Vector fInputPins; + uint8 fControlsBitmap; + Vector fModes; */}; @@ -174,13 +179,13 @@ class ProcessingUnit : public _AudioChannelCluster<_AudioControl> { public: ProcessingUnit(AudioControlInterface* interface, usb_audiocontrol_header_descriptor* Header); - virtual ~ProcessingUnit(); + virtual ~ProcessingUnit(); protected: - uint16 fProcessType; - Vector fInputPins; - uint8 fControlsBitmap; - Vector fModes; + uint16 fProcessType; + Vector fInputPins; + uint8 fControlsBitmap; + Vector fModes; }; @@ -188,12 +193,12 @@ class ExtensionUnit : public _AudioChannelCluster<_AudioControl> { public: ExtensionUnit(AudioControlInterface* interface, usb_audiocontrol_header_descriptor* Header); - virtual ~ExtensionUnit(); + virtual ~ExtensionUnit(); protected: - uint16 fExtensionCode; - Vector fInputPins; - uint8 fControlsBitmap; + uint16 fExtensionCode; + Vector fInputPins; + uint8 fControlsBitmap; }; @@ -201,7 +206,7 @@ class ClockSource : public _AudioControl { public: ClockSource(AudioControlInterface* interface, usb_audiocontrol_header_descriptor* Header); - virtual ~ClockSource(); + virtual ~ClockSource(); protected: }; @@ -211,7 +216,7 @@ class ClockSelector : public _AudioControl { public: ClockSelector(AudioControlInterface* interface, usb_audiocontrol_header_descriptor* Header); - virtual ~ClockSelector(); + virtual ~ClockSelector(); protected: }; @@ -221,7 +226,7 @@ class ClockMultiplier : public _AudioControl { public: ClockMultiplier(AudioControlInterface* interface, usb_audiocontrol_header_descriptor* Header); - virtual ~ClockMultiplier(); + virtual ~ClockMultiplier(); protected: }; @@ -232,88 +237,82 @@ public: SampleRateConverter( AudioControlInterface* interface, usb_audiocontrol_header_descriptor* Header); - virtual ~SampleRateConverter(); + virtual ~SampleRateConverter(); protected: }; -typedef VectorMap AudioControlsMap; -typedef VectorMap::Iterator AudioControlsIterator; - -typedef Vector<_AudioControl*> AudioControlsVector; -// typedef Vector<_AudioControl*>::Iterator AudioControlsIterator; - -class Device; - class AudioControlInterface { public: - AudioControlInterface(Device* device); - ~AudioControlInterface(); + AudioControlInterface(Device* device); + ~AudioControlInterface(); - status_t InitCheck() { return fStatus; } - status_t Init(size_t interface, usb_interface_info *Interface); + status_t InitCheck() { return fStatus; } + status_t Init(size_t interface, usb_interface_info* Interface); - _AudioControl* Find(uint8 id); - _AudioControl* FindOutputTerminal(uint8 id); - uint16 SpecReleaseNumber() { return fADCSpecification; } + _AudioControl* Find(uint8 id); + _AudioControl* FindOutputTerminal(uint8 id); + uint16 SpecReleaseNumber() { return fADCSpecification; } - AudioControlsMap& Controls() { return fAudioControls; } + AudioControlsMap& + Controls() { return fAudioControls; } - uint32 GetChannelsDescription( + uint32 GetChannelsDescription( Vector& Channels, - multi_description *Description, - AudioControlsVector &USBTerminals); - uint32 GetBusChannelsDescription( + multi_description* Description, + Vector<_AudioControl*>& USBTerminals); + uint32 GetBusChannelsDescription( Vector& Channels, - multi_description *Description); + multi_description* Description); - status_t GetMix(multi_mix_value_info *Info); - status_t SetMix(multi_mix_value_info *Info); - status_t ListMixControls(multi_mix_control_info* Info); + status_t GetMix(multi_mix_value_info* Info); + status_t SetMix(multi_mix_value_info* Info); + status_t ListMixControls(multi_mix_control_info* Info); protected: - status_t InitACHeader(size_t interface, + status_t InitACHeader(size_t interface, usb_audiocontrol_header_descriptor* Header); - uint32 GetTerminalChannels( + uint32 GetTerminalChannels( Vector& Channels, AudioChannelCluster* cluster, channel_kind kind, uint32 connectors = 0); - void _HarvestRecordFeatureUnits(_AudioControl* rootControl, + void _HarvestRecordFeatureUnits(_AudioControl* rootControl, AudioControlsMap& Map); - void _ListMixControlsPage(int32& index, + void _ListMixControlsPage(int32& index, multi_mix_control_info* Info, AudioControlsMap& Map, const char* Name); - int32 _ListFeatureUnitControl(int32& index, int32 parentId, + int32 _ListFeatureUnitControl(int32& index, int32 parentId, multi_mix_control_info* Info, _AudioControl* control); - uint32 _ListFeatureUnitOption(uint32 controlType, + uint32 _ListFeatureUnitOption(uint32 controlType, int32& index, int32 parentIndex, multi_mix_control_info* Info, FeatureUnit* unit, uint32 channel, uint32 channels); - void _ListSelectorUnitControl(int32& index, int32 parentGroup, - multi_mix_control_info* Info, + void _ListSelectorUnitControl(int32& index, + int32 parentGroup, multi_mix_control_info* Info, _AudioControl* control); - void _InitGainLimits(multi_mix_control& Control); + void _InitGainLimits(multi_mix_control& Control); - size_t fInterface; - status_t fStatus; - // part of AudioControl Header description - uint16 fADCSpecification; - Vector fStreams; - uint8 fFunctionCategory; - uint8 fControlsBitmap; - Device* fDevice; + size_t fInterface; + status_t fStatus; + // part of AudioControl Header description + uint16 fADCSpecification; + Vector fStreams; + uint8 fFunctionCategory; + uint8 fControlsBitmap; + Device* fDevice; - // map to store all controls and lookup by control ID - AudioControlsMap fAudioControls; - // map to store output terminal and lookup them by source ID - AudioControlsMap fOutputTerminals; - // map to store output terminal and lookup them by control ID - AudioControlsMap fInputTerminals; + // map to store all controls and lookup by control ID + AudioControlsMap fAudioControls; + // map to store output terminal and lookup them by source ID + AudioControlsMap fOutputTerminals; + // map to store output terminal and lookup them by control ID + AudioControlsMap fInputTerminals; }; + #endif // _AUDIO_CONTROL_INTERFACE_H_ diff --git a/src/add-ons/kernel/drivers/audio/usb_audio/AudioFunction.cpp b/src/add-ons/kernel/drivers/audio/usb_audio/AudioFunction.cpp deleted file mode 100644 index fcded987e2..0000000000 --- a/src/add-ons/kernel/drivers/audio/usb_audio/AudioFunction.cpp +++ /dev/null @@ -1,1092 +0,0 @@ -/* - * Driver for USB Audio Device Class devices. - * Copyright (c) 2009,10,12 S.Zharski - * Distributed under the tems of the MIT license. - * - */ - -#include "AudioFunction.h" -#include "Settings.h" -#include "Device.h" -#include "audio.h" - - -enum TerminalTypes { - // USB Terminal Types - UndefinedUSB_IO = 0x100, - StreamingUSB_IO = 0x101, - VendorUSB_IO = 0x1ff, - // Input Terminal Types - Undefined_In = 0x200, - Microphone_In = 0x201, - DesktopMic_In = 0x202, - PersonalMic_In = 0x203, - OmniMic_In = 0x204, - MicsArray_In = 0x205, - ProcMicsArray_In = 0x206, - // Output Terminal Types - Undefined_Out = 0x300, - Speaker_Out = 0x301, - HeadPhones_Out = 0x302, - HMDAudio_Out = 0x303, - DesktopSpeaker = 0x304, - RoomSpeaker = 0x305, - CommSpeaker = 0x306, - LFESpeaker = 0x307, - // Bi-directional Terminal Types - Undefined_IO = 0x400, - Handset_IO = 0x401, - Headset_IO = 0x402, - SpeakerPhone_IO = 0x403, - SpeakerPhoneES_IO = 0x404, - SpeakerPhoneEC_IO = 0x405, - // Telephony Terminal Types - UndefTelephony_IO = 0x500, - PhoneLine_IO = 0x501, - Telephone_IO = 0x502, - DownLinePhone_IO = 0x503, - // External Terminal Types - UndefinedExt_IO = 0x600, - AnalogConnector_IO = 0x601, - DAInterface_IO = 0x602, - LineConnector_IO = 0x603, - LegacyConnector_IO = 0x604, - SPDIFInterface_IO = 0x605, - DA1394Stream_IO = 0x606, - DV1394StreamSound_IO= 0x607, - ADATLightpipe_IO = 0x608, - TDIF_IO = 0x609, - MADI_IO = 0x60a, - // Embedded Terminal Types - UndefEmbedded_IO = 0x700, - LCNoiseSource_Out = 0x701, - EqualizationNoise_Out = 0x702, - CDPlayer_In = 0x703, - DAT_IO = 0x704, - DCC_IO = 0x705, - MiniDisk_IO = 0x706, - AnalogTape_IO = 0x707, - Phonograph_In = 0x708, - VCRAudio_In = 0x709, - VideoDiscAudio_In = 0x70a, - DVDAudio_In = 0x70b, - TVTunerAudio_In = 0x70c, - SatReceiverAudio_In = 0x70d, - CableTunerAudio_In = 0x70e, - DSSAudio_In = 0x70f, - Radio_Receiver_In = 0x710, - RadioTransmitter_In = 0x711, - MultiTrackRecorder_IO = 0x712, - Synthesizer_IO = 0x713, - Piano_IO = 0x714, - Guitar_IO = 0x715, - Drums_IO = 0x716, - Instrument_IO = 0x717 -}; - - -const char* -GetTerminalDescription(uint16 TerminalType) -{ - switch(TerminalType) { - // USB Terminal Types - case UndefinedUSB_IO: return "USB I/O"; - case StreamingUSB_IO: return "USB Streaming I/O"; - case VendorUSB_IO: return "Vendor USB I/O"; - // Input Terminal Types - case Undefined_In: return "Undefined Input"; - case Microphone_In: return "Microphone"; - case DesktopMic_In: return "Desktop Microphone"; - case PersonalMic_In: return "Personal Microphone"; - case OmniMic_In: return "Omni-directional Mic"; - case MicsArray_In: return "Microphone Array"; - case ProcMicsArray_In: return "Processing Mic Array"; - // Output Terminal Types - case Undefined_Out: return "Undefined Output"; - case Speaker_Out: return "Speaker"; - case HeadPhones_Out: return "Headphones"; - case HMDAudio_Out: return "Head Mounted Disp.Audio"; - case DesktopSpeaker: return "Desktop Speaker"; - case RoomSpeaker: return "Room Speaker"; - case CommSpeaker: return "Communication Speaker"; - case LFESpeaker: return "LFE Speaker"; - // Bi-directional Terminal Types - case Undefined_IO: return "Undefined I/O"; - case Handset_IO: return "Handset"; - case Headset_IO: return "Headset"; - case SpeakerPhone_IO: return "Speakerphone"; - case SpeakerPhoneES_IO: return "Echo-supp Speakerphone"; - case SpeakerPhoneEC_IO: return "Echo-cancel Speakerphone"; - // Telephony Terminal Types - case UndefTelephony_IO: return "Undefined Telephony"; - case PhoneLine_IO: return "Phone Line"; - case Telephone_IO: return "Telephone"; - case DownLinePhone_IO: return "Down Line Phone"; - // External Terminal Types - case UndefinedExt_IO: return "Undefined External I/O"; - case AnalogConnector_IO: return "Analog Connector"; - case DAInterface_IO: return "Digital Audio Interface"; - case LineConnector_IO: return "Line Connector"; - case LegacyConnector_IO: return "LegacyAudioConnector"; - case SPDIFInterface_IO: return "S/PDIF Interface"; - case DA1394Stream_IO: return "1394 DA Stream"; - case DV1394StreamSound_IO: return "1394 DV Stream Soundtrack"; - case ADATLightpipe_IO: return "Alesis DAT Stream"; - case TDIF_IO: return "Tascam Digital Interface"; - case MADI_IO: return "AES Multi-channel interface"; - // Embedded Terminal Types - case UndefEmbedded_IO: return "Undefined Embedded I/O"; - case LCNoiseSource_Out: return "Level Calibration Noise Source"; - case EqualizationNoise_Out: return "Equalization Noise"; - case CDPlayer_In: return "CD Player"; - case DAT_IO: return "DAT"; - case DCC_IO: return "DCC"; - case MiniDisk_IO: return "Mini Disk"; - case AnalogTape_IO: return "Analog Tape"; - case Phonograph_In: return "Phonograph"; - case VCRAudio_In: return "VCR Audio"; - case VideoDiscAudio_In: return "Video Disc Audio"; - case DVDAudio_In: return "DVD Audio"; - case TVTunerAudio_In: return "TV Tuner Audio"; - case SatReceiverAudio_In: return "Satellite Receiver Audio"; - case CableTunerAudio_In: return "Cable Tuner Audio"; - case DSSAudio_In: return "DSS Audio"; - case Radio_Receiver_In: return "Radio Receiver"; - case RadioTransmitter_In: return "Radio Transmitter"; - case MultiTrackRecorder_IO: return "Multi-track Recorder"; - case Synthesizer_IO: return "Synthesizer"; - case Piano_IO: return "Piano"; - case Guitar_IO: return "Guitar"; - case Drums_IO: return "Percussion Instrument"; - case Instrument_IO: return "Musical Instrument"; - } - - TRACE_ALWAYS("Unknown Terminal Type: %#06x", TerminalType); - return "Unknown"; -} - - -_AudioFunctionEntity::_AudioFunctionEntity(Device* device, size_t interface) - : - fStatus(B_NO_INIT), - fDevice(device), - fInterface(interface) -{ -} - - -_AudioFunctionEntity::~_AudioFunctionEntity() -{ - -} - - -_AudioControl::_AudioControl(Device* device, size_t interface, - usb_audiocontrol_header_descriptor* Header) - : - _AudioFunctionEntity(device, interface), - fSubType(Header->descriptor_subtype), - fID(0), - fSourceID(0), - fStringIndex(0) -{ -} - - -_AudioControl::~_AudioControl() -{ -} - - -_AudioChannelsCluster* -_AudioControl::OutputCluster() -{ - if (SourceID() == 0 || fDevice == 0) { - return NULL; - } - - _AudioControl* control = fDevice->FindAudioControl(SourceID()); - if (control == 0) { - return NULL; - } - - return control->OutputCluster(); -} - - -AudioControlHeader::AudioControlHeader(Device* device, size_t interface, - usb_audiocontrol_header_descriptor* Header) - : - _AudioControl(device, interface, Header), - fADCSpecification(0), - fFunctionCategory(0), - fControlsBitmap(0) -{ - if (Header == NULL) { - return; - } - - fADCSpecification = Header->bcd_release_no; - TRACE("ADCSpecification:%#06x\n", fADCSpecification); - - if (fADCSpecification < 0x200) { - usb_audiocontrol_header_descriptor_r1* Header1 - = (usb_audiocontrol_header_descriptor_r1*) Header; - - TRACE("InterfacesCount:%d\n", Header1->in_collection); - for (size_t i = 0; i < Header1->in_collection; i++) { - fStreams.PushBack(Header1->interface_numbers[i]); - TRACE("Interface[%d] number is %d\n", i, fStreams[i]); - } - } else { - fFunctionCategory = Header->function_category; - fControlsBitmap = Header->bm_controls; - TRACE("Function Category:%#04x\n", fFunctionCategory); - TRACE("Controls Bitmap:%#04x\n", fControlsBitmap); - } - - fStatus = B_OK; -} - - -AudioControlHeader::~AudioControlHeader() -{ - -} - - -_AudioChannelsCluster::_AudioChannelsCluster() - : - fOutChannelsNumber(0), - fChannelsConfig(0), - fChannelNames(0) -{ - -} - - -_AudioChannelsCluster::~_AudioChannelsCluster() -{ - -} - - -_AudioChannelsCluster* -_AudioChannelsCluster::OutputCluster() -{ - return this; -} - - -_Terminal::_Terminal(Device* device, size_t interface, - usb_audiocontrol_header_descriptor* Header) - : - _AudioControl(device, interface, Header), - fTerminalType(0), - fAssociatedTerminal(0), - fClockSourceId(0), - fControlsBitmap(0) -{ - -} - - -_Terminal::~_Terminal() -{ - -} - - -const char* -_Terminal::Name() -{ - return GetTerminalDescription(fTerminalType); -} - - -bool -_Terminal::IsUSBIO() -{ - return (fTerminalType && 0xff00) == UndefinedUSB_IO; -} - - -InputTerminal::InputTerminal(Device* device, size_t interface, - usb_audiocontrol_header_descriptor* Header) - : - _Terminal(device, interface, Header) -{ - usb_input_terminal_descriptor_r1* Terminal - = (usb_input_terminal_descriptor_r1*) Header; - fID = Terminal->terminal_id; - fTerminalType = Terminal->terminal_type; - fAssociatedTerminal = Terminal->assoc_terminal; - - TRACE("Input Terminal ID:%d\n", fID); - TRACE("Terminal type:%s (%#06x)\n", - GetTerminalDescription(fTerminalType), fTerminalType); - TRACE("Assoc.terminal:%d\n", fAssociatedTerminal); - - if (device->SpecReleaseNumber() < 0x200) { - fOutChannelsNumber = Terminal->num_channels; - fChannelsConfig = Terminal->channel_config; - fChannelNames = Terminal->channel_names; - fStringIndex = Terminal->terminal; - } else { - usb_input_terminal_descriptor* Terminal - = (usb_input_terminal_descriptor*) Header; - fClockSourceId = Terminal->clock_source_id; - fOutChannelsNumber = Terminal->num_channels; - fChannelsConfig = Terminal->channel_config; - fChannelNames = Terminal->channel_names; - fControlsBitmap = Terminal->bm_controls; - fStringIndex = Terminal->terminal; - - TRACE("Clock Source ID:%d\n", fClockSourceId); - TRACE("Controls Bitmap:%#04x\n", fControlsBitmap); - } - - TRACE("Out.channels num:%d\n", fOutChannelsNumber); - TRACE("Channels config:%#06x\n", fChannelsConfig); - TRACE("Channels names:%d\n", fChannelNames); - TRACE("StringIndex:%d\n", fStringIndex); - - fStatus = B_OK; -} - - -InputTerminal::~InputTerminal() -{ -} - - -OutputTerminal::OutputTerminal(Device* device, size_t interface, - usb_audiocontrol_header_descriptor* Header) - : - _Terminal(device, interface, Header) -{ - usb_output_terminal_descriptor_r1* Terminal - = (usb_output_terminal_descriptor_r1*) Header; - - fID = Terminal->terminal_id; - fTerminalType = Terminal->terminal_type; - fAssociatedTerminal = Terminal->assoc_terminal; - fSourceID = Terminal->source_id; - - TRACE("Output Terminal ID:%d\n", fID); - TRACE("Terminal type:%s (%#06x)\n", - GetTerminalDescription(fTerminalType), fTerminalType); - TRACE("Assoc.terminal:%d\n", fAssociatedTerminal); - TRACE("Source ID:%d\n", fSourceID); - - if (device->SpecReleaseNumber() < 0x200) { - fStringIndex = Terminal->terminal; - } else { - usb_output_terminal_descriptor* Terminal - = (usb_output_terminal_descriptor*) Header; - - fClockSourceId = Terminal->clock_source_id; - fControlsBitmap = Terminal->bm_controls; - fStringIndex = Terminal->terminal; - - TRACE("Clock Source ID:%d\n", fClockSourceId); - TRACE("Controls Bitmap:%#04x\n", fControlsBitmap); - } - - TRACE("StringIndex:%d\n", fStringIndex); - - fStatus = B_OK; -} - - -OutputTerminal::~OutputTerminal() -{ -} - - -MixerUnit::MixerUnit(Device* device, size_t interface, - usb_audiocontrol_header_descriptor* Header) - : - _AudioControl(device, interface, Header), - fControlsBitmap(0) -{ - usb_mixer_unit_descriptor* Mixer - = (usb_mixer_unit_descriptor*) Header; - - fID = Mixer->unit_id; - TRACE("Mixer ID:%d\n", fID); - - TRACE("Number of input pins:%d\n", Mixer->num_input_pins); - for (size_t i = 0; i < Mixer->num_input_pins; i++) { - fInputPins.PushBack(Mixer->input_pins[i]); - TRACE("Input pin #%d:%d\n", i, fInputPins[i]); - } - - uint8* mixerControlsData = NULL; - uint8 mixerControlsSize = 0; - - if (device->SpecReleaseNumber() < 0x200) { - usb_output_channels_descriptor_r1* OutChannels - = (usb_output_channels_descriptor_r1*) - &Mixer->input_pins[Mixer->num_input_pins]; - - fOutChannelsNumber = OutChannels->num_output_pins; - fChannelsConfig = OutChannels->channel_config; - fChannelNames = OutChannels->channel_names; - - mixerControlsData = (uint8*) ++OutChannels; - mixerControlsSize = Mixer->length - 10 - Mixer->num_input_pins; - fStringIndex = *(mixerControlsData + mixerControlsSize); - } else { - usb_output_channels_descriptor* OutChannels - = (usb_output_channels_descriptor*) - &Mixer->input_pins[Mixer->num_input_pins]; - - fOutChannelsNumber = OutChannels->num_output_pins; - fChannelsConfig = OutChannels->channel_config; - fChannelNames = OutChannels->channel_names; - - mixerControlsData = (uint8*) ++OutChannels; - mixerControlsSize = Mixer->length - 13 - Mixer->num_input_pins; - fControlsBitmap = *(mixerControlsData + mixerControlsSize); - fStringIndex = *(mixerControlsData + mixerControlsSize + 1); - - TRACE("Control Bitmap:%#04x\n", fControlsBitmap); - } - - TRACE("Out channels number:%d\n", fOutChannelsNumber); - TRACE("Out channels config:%#06x\n", fChannelsConfig); - TRACE("Out channels names:%d\n", fChannelNames); - TRACE("Controls Size:%d\n", mixerControlsSize); - - for (size_t i = 0; i < mixerControlsSize; i++) { - fProgrammableControls.PushBack(mixerControlsData[i]); - TRACE("Controls Data[%d]:%#x\n", i, fProgrammableControls[i]); - } - - TRACE("StringIndex:%d\n", fStringIndex); - - fStatus = B_OK; -} - - -MixerUnit::~MixerUnit() -{ -} - - -SelectorUnit::SelectorUnit(Device* device, size_t interface, - usb_audiocontrol_header_descriptor* Header) - : - _AudioControl(device, interface, Header), - fControlsBitmap(0) -{ - usb_selector_unit_descriptor* Selector - = (usb_selector_unit_descriptor*) Header; - - fID = Selector->unit_id; - TRACE("Selector ID:%d\n", fID); - - TRACE("Number of input pins:%d\n", Selector->num_input_pins); - for (size_t i = 0; i < Selector->num_input_pins; i++) { - fInputPins.PushBack(Selector->input_pins[i]); - TRACE("Input pin #%d:%d\n", i, fInputPins[i]); - } - - if (device->SpecReleaseNumber() < 0x200) { - - fStringIndex = Selector->input_pins[Selector->num_input_pins]; - } else { - - fControlsBitmap = Selector->input_pins[Selector->num_input_pins]; - fStringIndex = Selector->input_pins[Selector->num_input_pins + 1]; - - TRACE("Controls Bitmap:%d\n", fControlsBitmap); - } - - TRACE("StringIndex:%d\n", fStringIndex); - - fStatus = B_OK; -} - - -SelectorUnit::~SelectorUnit() -{ -} - - -FeatureUnit::FeatureUnit(Device* device, size_t interface, - usb_audiocontrol_header_descriptor* Header) - : - _AudioControl(device, interface, Header) -{ - usb_feature_unit_descriptor* Feature - = (usb_feature_unit_descriptor*) Header; - - fID = Feature->unit_id; - TRACE("Feature ID:%d\n", fID); - - fSourceID = Feature->source_id; - TRACE("Source ID:%d\n", fSourceID); - - uint8 controlSize = 4; - uint8 channelsCount = (Feature->length - 6) / controlSize; - uint8 *ControlsBitmapPointer = (uint8*)&Feature->bma_controls[0]; - - if (device->SpecReleaseNumber() < 0x200) { - usb_feature_unit_descriptor_r1* Feature - = (usb_feature_unit_descriptor_r1*) Header; - controlSize = Feature->control_size; - channelsCount = (Feature->length - 7) / Feature->control_size; - ControlsBitmapPointer = &Feature->bma_controls[0]; - } - - TRACE("Channel bitmap size:%d\n", controlSize); - TRACE("Channels number:%d\n", channelsCount - 1); // not add master! - - for (size_t i = 0; i < channelsCount; i++) { - uint8 *controlPointer = &ControlsBitmapPointer[i * controlSize]; - switch(controlSize) { - case 1: fControlBitmaps.PushBack(*controlPointer); break; - case 2: fControlBitmaps.PushBack(*(uint16*)controlPointer); break; - case 4: fControlBitmaps.PushBack(*(uint32*)controlPointer); break; - default: - TRACE_ALWAYS("Feature control of unsupported size %d ignored\n", - controlSize); - continue; - } - - TraceChannel(device, i); - } - - fStringIndex = ControlsBitmapPointer[channelsCount * controlSize]; - TRACE("StringIndex:%d\n", fStringIndex); - - fStatus = B_OK; -} - - -FeatureUnit::~FeatureUnit() -{ -} - - -const char* -FeatureUnit::Name() -{ - // first check if source of this FU is an input terminal - AudioControlsIterator it = fDevice->fAudioControls.Find(fSourceID); - while (it != fDevice->fAudioControls.End()) { - _AudioControl *control = it->Value(); - if (control != 0) - break; - - if (control->SubType() != IDSInputTerminal) - break; - - // USB I/O terminal is a not good candidate to use it's name - if (static_cast<_Terminal*>(control)->IsUSBIO()) - break; - - // use the name of source input terminal as name of this FU - return control->Name(); - } - - // check if output of this FU is connected to output terminal - it = fDevice->fOutputTerminals.Find(fID); - while (it != fDevice->fOutputTerminals.End()) { - _AudioControl *control = it->Value(); - if (control != 0) - break; - - if (control->SubType() != IDSOutputTerminal) - break; - - // USB I/O terminal is a not good candidate to use it's name - uint16 Type = static_cast(control)->TerminalType(); - if ((Type && 0xff00) == UndefinedUSB_IO) - break; - - // use the name of this output terminal as name of this FU - return control->Name(); - } - - return "Unknown"; -} - - -bool -FeatureUnit::HasControl(int32 Channel, uint32 Control) -{ - if (Channel >= fControlBitmaps.Count()) { - TRACE_ALWAYS("Out of limits error of retrieving control %#010x " - "for channel %d\n", Control, Channel); - return false; - } - - return (Control & fControlBitmaps[Channel]) != 0; -} - - -void -FeatureUnit::TraceChannel(Device* device, int32 Channel) -{ - if (Channel >= fControlBitmaps.Count()) { - TRACE_ALWAYS("Out of limits error of tracing channel %d\n", Channel); - return; - } - - if (Channel == 0) - TRACE("Master channel bitmap:%#x\n", fControlBitmaps[Channel]); - else - TRACE("Channel %d bitmap:%#x\n", Channel, fControlBitmaps[Channel]); - - if (device->SpecReleaseNumber() < 0x200) { - if (HasControl(Channel, MuteControl1)) - TRACE("\tMute\n"); - if (HasControl(Channel, VolumeControl1)) - TRACE("\tVolume\n"); - if (HasControl(Channel, BassControl1)) - TRACE("\tBass\n"); - if (HasControl(Channel, MidControl1)) - TRACE("\tMid\n"); - if (HasControl(Channel, TrebleControl1)) - TRACE("\tTreble\n"); - if (HasControl(Channel, GraphEqControl1)) - TRACE("\tGraphic Equalizer\n"); - if (HasControl(Channel, AutoGainControl1)) - TRACE("\tAutomatic Gain\n"); - if (HasControl(Channel, DelayControl1)) - TRACE("\tDelay\n"); - if (HasControl(Channel, BassBoostControl1)) - TRACE("\tBass Boost\n"); - if (HasControl(Channel, LoudnessControl1)) - TRACE("\tLoudness\n"); - } else { - if (HasControl(Channel, MuteControl)) - TRACE("\tMute\n"); - if (HasControl(Channel, VolumeControl)) - TRACE("\tVolume\n"); - if (HasControl(Channel, BassControl)) - TRACE("\tBass\n"); - if (HasControl(Channel, MidControl)) - TRACE("\tMid\n"); - if (HasControl(Channel, TrebleControl)) - TRACE("\tTreble\n"); - if (HasControl(Channel, GraphEqControl)) - TRACE("\tGraphic Equalizer\n"); - if (HasControl(Channel, AutoGainControl)) - TRACE("\tAutomatic Gain\n"); - if (HasControl(Channel, DelayControl)) - TRACE("\tDelay\n"); - if (HasControl(Channel, BassBoostControl)) - TRACE("\tBass Boost\n"); - if (HasControl(Channel, LoudnessControl)) - TRACE("\tLoudness\n"); - if (HasControl(Channel, InputGainControl)) - TRACE("\tInputGain\n"); - if (HasControl(Channel, InputGainPadControl)) - TRACE("\tInputGainPad\n"); - if (HasControl(Channel, PhaseInverterControl)) - TRACE("\tPhaseInverter\n"); - if (HasControl(Channel, UnderflowControl)) - TRACE("\tUnderflow\n"); - if (HasControl(Channel, OverflowControl)) - TRACE("\tOverflow\n"); - } -} - - -EffectUnit::EffectUnit(Device* device, size_t interface, - usb_audiocontrol_header_descriptor* Header) - : - _AudioControl(device, interface, Header) -{ - usb_input_terminal_descriptor* D - = (usb_input_terminal_descriptor*) Header; - TRACE("Effect Unit:%d\n", D->terminal_id); -} - - -EffectUnit::~EffectUnit() -{ -} - - -ProcessingUnit::ProcessingUnit(Device* device, size_t interface, - usb_audiocontrol_header_descriptor* Header) - : - _AudioControl(device, interface, Header), - fProcessType(0), - fControlsBitmap(0) -{ - usb_processing_unit_descriptor* Processing - = (usb_processing_unit_descriptor*) Header; - - fID = Processing->unit_id; - TRACE("Processing ID:%d\n", fID); - - fProcessType = Processing->process_type; - TRACE("Processing Type:%d\n", fProcessType); - - TRACE("Number of input pins:%d\n", Processing->num_input_pins); - for (size_t i = 0; i < Processing->num_input_pins; i++) { - fInputPins.PushBack(Processing->input_pins[i]); - TRACE("Input pin #%d:%d\n", i, fInputPins[i]); - } - - if (device->SpecReleaseNumber() < 0x200) { - usb_output_channels_descriptor_r1* OutChannels - = (usb_output_channels_descriptor_r1*) - &Processing->input_pins[Processing->num_input_pins]; - - fOutChannelsNumber = OutChannels->num_output_pins; - fChannelsConfig = OutChannels->channel_config; - fChannelNames = OutChannels->channel_names; - } else { - usb_output_channels_descriptor* OutChannels - = (usb_output_channels_descriptor*) - &Processing->input_pins[Processing->num_input_pins]; - - fOutChannelsNumber = OutChannels->num_output_pins; - fChannelsConfig = OutChannels->channel_config; - fChannelNames = OutChannels->channel_names; - } - - TRACE("Out channels number:%d\n", fOutChannelsNumber); - TRACE("Out channels config:%#06x\n", fChannelsConfig); - TRACE("Out channels names:%d\n", fChannelNames); - /* - uint8 controlsSize = Processing->length - 10 - Processing->num_input_pins; - TRACE("Controls Size:%d\n", controlsSize); - - uint8* controlsData = (uint8*) ++OutChannels; - - for (size_t i = 0; i < controlsSize; i++) { - fProgrammableControls.PushBack(controlsData[i]); - TRACE("Controls Data[%d]:%#x\n", i, controlsData[i]); - } - - fStringIndex = *(controlsData + controlsSize); - - TRACE("StringIndex:%d\n", fStringIndex); -*/ - fStatus = B_OK; -} - - -ProcessingUnit::~ProcessingUnit() -{ -} - - -ExtensionUnit::ExtensionUnit(Device* device, size_t interface, - usb_audiocontrol_header_descriptor* Header) - : - _AudioControl(device, interface, Header), - fExtensionCode(0), - fControlsBitmap(0) -{ - usb_extension_unit_descriptor* Extension - = (usb_extension_unit_descriptor*) Header; - - fID = Extension->unit_id; - TRACE("Extension ID:%d\n", fID); - - fExtensionCode = Extension->extension_code; - TRACE("Extension Type:%d\n", fExtensionCode); - - TRACE("Number of input pins:%d\n", Extension->num_input_pins); - for (size_t i = 0; i < Extension->num_input_pins; i++) { - fInputPins.PushBack(Extension->input_pins[i]); - TRACE("Input pin #%d:%d\n", i, fInputPins[i]); - } - - - if (device->SpecReleaseNumber() < 0x200) { - usb_output_channels_descriptor_r1* OutChannels - = (usb_output_channels_descriptor_r1*) - &Extension->input_pins[Extension->num_input_pins]; - - fOutChannelsNumber = OutChannels->num_output_pins; - fChannelsConfig = OutChannels->channel_config; - fChannelNames = OutChannels->channel_names; - } else { - usb_output_channels_descriptor* OutChannels - = (usb_output_channels_descriptor*) - &Extension->input_pins[Extension->num_input_pins]; - - fOutChannelsNumber = OutChannels->num_output_pins; - fChannelsConfig = OutChannels->channel_config; - fChannelNames = OutChannels->channel_names; - } - - TRACE("Out channels number:%d\n", fOutChannelsNumber); - TRACE("Out channels config:%#06x\n", fChannelsConfig); - TRACE("Out channels names:%d\n", fChannelNames); - /* - uint8 controlsSize = Processing->length - 10 - Processing->num_input_pins; - TRACE("Controls Size:%d\n", controlsSize); - - uint8* controlsData = (uint8*) ++OutChannels; - - for (size_t i = 0; i < controlsSize; i++) { - fProgrammableControls.PushBack(controlsData[i]); - TRACE("Controls Data[%d]:%#x\n", i, controlsData[i]); - } - - fStringIndex = *(controlsData + controlsSize); - - TRACE("StringIndex:%d\n", fStringIndex); -*/ - fStatus = B_OK; -} - - -ExtensionUnit::~ExtensionUnit() -{ -} - - -ClockSource::ClockSource(Device* device, size_t interface, - usb_audiocontrol_header_descriptor* Header) - : - _AudioControl(device, interface, Header) -{ - usb_input_terminal_descriptor* D - = (usb_input_terminal_descriptor*) Header; - TRACE("Clock Source:%d\n", D->terminal_id); -} - - -ClockSource::~ClockSource() -{ -} - - -ClockSelector::ClockSelector(Device* device, size_t interface, - usb_audiocontrol_header_descriptor* Header) - : - _AudioControl(device, interface, Header) -{ - usb_input_terminal_descriptor* D - = (usb_input_terminal_descriptor*) Header; - TRACE("Clock Selector:%d\n", D->terminal_id); -} - - -ClockSelector::~ClockSelector() -{ -} - - -ClockMultiplier::ClockMultiplier(Device* device, size_t interface, - usb_audiocontrol_header_descriptor* Header) - : - _AudioControl(device, interface, Header) -{ - usb_input_terminal_descriptor* D - = (usb_input_terminal_descriptor*) Header; - TRACE("Clock Multiplier:%d\n", D->terminal_id); -} - - -ClockMultiplier::~ClockMultiplier() -{ -} - - -SampleRateConverter::SampleRateConverter(Device* device, size_t interface, - usb_audiocontrol_header_descriptor* Header) - : - _AudioControl(device, interface, Header) -{ - usb_input_terminal_descriptor* D - = (usb_input_terminal_descriptor*) Header; - TRACE("Sample Rate Converter:%d\n", D->terminal_id); -} - - -SampleRateConverter::~SampleRateConverter() -{ -} - - -// -// Audio Stream information entities -// -// -ASInterfaceDescriptor::ASInterfaceDescriptor(Device* device, size_t interface, - usb_as_interface_descriptor_r1* Descriptor) - : - _AudioFunctionEntity(device, interface), - fTerminalLink(0), - fDelay(0), - fFormatTag(0) -{ - fTerminalLink = Descriptor->terminal_link; - fDelay = Descriptor->delay; - fFormatTag = Descriptor->format_tag; - - TRACE("fTerminalLink:%d\n", fTerminalLink); - TRACE("fDelay:%d\n", fDelay); - TRACE("fFormatTag:%#06x\n", fFormatTag); - - fStatus = B_OK; -} - - -ASInterfaceDescriptor::~ASInterfaceDescriptor() -{ - -} - - -ASEndpointDescriptor::ASEndpointDescriptor(Device* device, size_t interface, - usb_as_cs_endpoint_descriptor* Descriptor) - : - _AudioFunctionEntity(device, interface), - fAttributes(0), - fLockDelayUnits(0), - fLockDelay(0) -{ - - fAttributes = Descriptor->attributes; - fLockDelayUnits = Descriptor->lock_delay_units; - fLockDelay = Descriptor->lock_delay; - - TRACE("fAttributes:%d\n", fAttributes); - TRACE("fLockDelayUnits:%d\n", fLockDelayUnits); - TRACE("fLockDelay:%d\n", fLockDelay); - - fStatus = B_OK; -} - - -ASEndpointDescriptor::~ASEndpointDescriptor() -{ -} - - -_ASFormatDescriptor::_ASFormatDescriptor(Device* device, size_t interface) - : - _AudioFunctionEntity(device, interface) -{ -} - - -_ASFormatDescriptor::~_ASFormatDescriptor() -{ -} - - -uint32 -_ASFormatDescriptor::GetSamFreq(uint8* freq) -{ - return freq[0] | freq[1] << 8 | freq[2] << 16; -} - - -TypeIFormatDescriptor::TypeIFormatDescriptor(Device* device, size_t interface, - usb_type_I_format_descriptor* Descriptor) - : - _ASFormatDescriptor(device, interface), - fNumChannels(0), - fSubframeSize(0), - fBitResolution(0), - fSampleFrequencyType(0) -{ - fStatus = Init(Descriptor); -} - - -TypeIFormatDescriptor::~TypeIFormatDescriptor() -{ -} - - -status_t -TypeIFormatDescriptor::Init(usb_type_I_format_descriptor* Descriptor) -{ - fNumChannels = Descriptor->nr_channels; - fSubframeSize = Descriptor->subframe_size; - fBitResolution = Descriptor->bit_resolution; - fSampleFrequencyType = Descriptor->sam_freq_type; - - if (fSampleFrequencyType == 0) { - fSampleFrequencies.PushBack( - GetSamFreq(Descriptor->sf.cont.lower_sam_freq)); - fSampleFrequencies.PushBack( - GetSamFreq(Descriptor->sf.cont.upper_sam_freq)); - } else { - for (size_t i = 0; i < fSampleFrequencyType; i++) { - fSampleFrequencies.PushBack( - GetSamFreq(Descriptor->sf.discr.sam_freq[i])); - } - } - - TRACE("fNumChannels:%d\n", fNumChannels); - TRACE("fSubframeSize:%d\n", fSubframeSize); - TRACE("fBitResolution:%d\n", fBitResolution); - TRACE("fSampleFrequencyType:%d\n", fSampleFrequencyType); - - for (int32 i = 0; i < fSampleFrequencies.Count(); i++) { - TRACE("Frequency #%d: %d\n", i, fSampleFrequencies[i]); - } - - return B_OK; -} - - -TypeIIFormatDescriptor::TypeIIFormatDescriptor(Device* device, size_t interface, - usb_type_II_format_descriptor* Descriptor) - : - _ASFormatDescriptor(device, interface), - fMaxBitRate(0), - fSamplesPerFrame(0), - fSampleFrequencyType(0), - fSampleFrequencies(0) -{ -} - - -TypeIIFormatDescriptor::~TypeIIFormatDescriptor() -{ -} - - -TypeIIIFormatDescriptor::TypeIIIFormatDescriptor(Device* device, size_t interface, - usb_type_III_format_descriptor* Descriptor) - : - TypeIFormatDescriptor(device, interface, - (usb_type_I_format_descriptor*) Descriptor) -{ - -} - - -TypeIIIFormatDescriptor::~TypeIIIFormatDescriptor() -{ -} - - -AudioStreamAlternate::AudioStreamAlternate(size_t alternate, - ASInterfaceDescriptor* interface, - ASEndpointDescriptor* endpoint, - _ASFormatDescriptor* format) - : - fAlternate(alternate), - fInterface(interface), - fEndpoint(endpoint), - fFormat(format) -{ -} - - -AudioStreamAlternate::~AudioStreamAlternate() -{ - delete fInterface; - delete fEndpoint; - delete fFormat; -} - diff --git a/src/add-ons/kernel/drivers/audio/usb_audio/AudioFunction.h b/src/add-ons/kernel/drivers/audio/usb_audio/AudioFunction.h deleted file mode 100644 index 187795f9e5..0000000000 --- a/src/add-ons/kernel/drivers/audio/usb_audio/AudioFunction.h +++ /dev/null @@ -1,349 +0,0 @@ -/* - * Driver for USB Audio Device Class devices. - * Copyright (c) 2009,10,12 S.Zharski - * Distributed under the terms of the MIT license. - * - */ -#ifndef _AUDIO_FUNCTION_H_ -#define _AUDIO_FUNCTION_H_ - - -#include - -#include "Driver.h" -#include "USB_audio_spec.h" - - -class Device; - -// -// base class for all entities in Audio Function -// -// -class _AudioFunctionEntity { -public: - _AudioFunctionEntity(Device* device, size_t interface); - ~_AudioFunctionEntity(); - - status_t InitCheck() { return fStatus; }; - -protected: - // state tracking - status_t fStatus; - Device* fDevice; - size_t fInterface; -}; - - -class _AudioChannelsCluster { -public: - _AudioChannelsCluster(); - virtual ~_AudioChannelsCluster(); - -virtual _AudioChannelsCluster* OutputCluster(); - -protected: - uint8 fOutChannelsNumber; - uint32 fChannelsConfig; - uint8 fChannelNames; -}; - - -// -// base class for Audio Controls (Units and Terminals) -// -// -class _AudioControl : public _AudioFunctionEntity { -public: - _AudioControl(Device* device, size_t interface, - usb_audiocontrol_header_descriptor* Header); - virtual ~_AudioControl(); - - uint8 ID() { return fID; } - uint8 SourceID() { return fSourceID; } - uint8 SubType() { return fSubType; } -virtual const char* Name() { return ""; } -virtual _AudioChannelsCluster* OutputCluster(); - -protected: - // state tracking - uint8 fSubType; - uint8 fID; - uint8 fSourceID; - uint8 fStringIndex; -}; - - -class AudioControlHeader : public _AudioControl { -public: - AudioControlHeader(Device* device, size_t interface, - usb_audiocontrol_header_descriptor* Header); - virtual ~AudioControlHeader(); - -// protected: - uint16 fADCSpecification; - Vector fStreams; - uint8 fFunctionCategory; - uint8 fControlsBitmap; -}; - - -class _Terminal : public _AudioControl { -public: - _Terminal(Device* device, size_t interface, - usb_audiocontrol_header_descriptor* Header); - virtual ~_Terminal(); - - uint16 TerminalType() { return fTerminalType; } - bool IsUSBIO(); -virtual const char* Name(); - -protected: - uint16 fTerminalType; - uint8 fAssociatedTerminal; - uint8 fClockSourceId; - uint16 fControlsBitmap; -}; - - -class InputTerminal : public _Terminal, public _AudioChannelsCluster { -public: - InputTerminal(Device* device, size_t interface, - usb_audiocontrol_header_descriptor* Header); - virtual ~InputTerminal(); - -protected: -}; - - -class OutputTerminal : public _Terminal { -public: - OutputTerminal(Device* device, size_t interface, - usb_audiocontrol_header_descriptor* Header); - virtual ~OutputTerminal(); - -protected: -}; - - -class MixerUnit : public _AudioControl, public _AudioChannelsCluster { -public: - MixerUnit(Device* device, size_t interface, - usb_audiocontrol_header_descriptor* Header); - virtual ~MixerUnit(); - -protected: - Vector fInputPins; - Vector fProgrammableControls; - uint8 fControlsBitmap; -}; - - -class SelectorUnit : public _AudioControl { -public: - SelectorUnit(Device* device, size_t interface, - usb_audiocontrol_header_descriptor* Header); - virtual ~SelectorUnit(); - -protected: - Vector fInputPins; - uint8 fControlsBitmap; -}; - - -class FeatureUnit : public _AudioControl { -public: - FeatureUnit(Device* device, size_t interface, - usb_audiocontrol_header_descriptor* Header); - virtual ~FeatureUnit(); - -virtual const char* Name(); - bool HasControl(int32 Channel, uint32 Control); - -protected: - void TraceChannel(Device* device, int32 Channel); - - Vector fControlBitmaps; -}; - - -class EffectUnit : public _AudioControl/*, public _AudioChannelsCluster*/ { -public: - EffectUnit(Device* device, size_t interface, - usb_audiocontrol_header_descriptor* Header); - virtual ~EffectUnit(); - -protected: -/* uint16 fProcessType; - Vector fInputPins; - uint8 fControlsBitmap; - Vector fModes; -*/}; - - -class ProcessingUnit : public _AudioControl, public _AudioChannelsCluster { -public: - ProcessingUnit(Device* device, size_t interface, - usb_audiocontrol_header_descriptor* Header); - virtual ~ProcessingUnit(); - -protected: - uint16 fProcessType; - Vector fInputPins; - uint8 fControlsBitmap; - Vector fModes; -}; - - -class ExtensionUnit : public _AudioControl, public _AudioChannelsCluster { -public: - ExtensionUnit(Device* device, size_t interface, - usb_audiocontrol_header_descriptor* Header); - virtual ~ExtensionUnit(); - -protected: - uint16 fExtensionCode; - Vector fInputPins; - uint8 fControlsBitmap; -}; - - -class ClockSource : public _AudioControl { -public: - ClockSource(Device* device, size_t interface, - usb_audiocontrol_header_descriptor* Header); - virtual ~ClockSource(); - -protected: -}; - - -class ClockSelector : public _AudioControl { -public: - ClockSelector(Device* device, size_t interface, - usb_audiocontrol_header_descriptor* Header); - virtual ~ClockSelector(); - -protected: -}; - - -class ClockMultiplier : public _AudioControl { -public: - ClockMultiplier(Device* device, size_t interface, - usb_audiocontrol_header_descriptor* Header); - virtual ~ClockMultiplier(); - -protected: -}; - - -class SampleRateConverter : public _AudioControl { -public: - SampleRateConverter(Device* device, size_t interface, - usb_audiocontrol_header_descriptor* Header); - virtual ~SampleRateConverter(); -protected: -}; - - -// -// Audio Streaming Interface information entities -// -// -class ASInterfaceDescriptor : public _AudioFunctionEntity { -public: - ASInterfaceDescriptor(Device* device, size_t interface, - usb_as_interface_descriptor_r1* Descriptor); - ~ASInterfaceDescriptor(); -// protected: - uint8 fTerminalLink; - uint8 fDelay; - uint16 fFormatTag; -}; - - -class ASEndpointDescriptor : public _AudioFunctionEntity { -public: - ASEndpointDescriptor(Device* device, size_t interface, - usb_as_cs_endpoint_descriptor* Descriptor); - ~ASEndpointDescriptor(); -// protected: - uint8 fAttributes; - uint8 fLockDelayUnits; - uint16 fLockDelay; -}; - - -class _ASFormatDescriptor : public _AudioFunctionEntity { -public: - _ASFormatDescriptor(Device* device, size_t interface); - virtual ~_ASFormatDescriptor(); - -// protected: - uint32 GetSamFreq(uint8* freq); -}; - - -class TypeIFormatDescriptor : public _ASFormatDescriptor { -public: - TypeIFormatDescriptor(Device* device, size_t interface, - usb_type_I_format_descriptor* Descriptor); - virtual ~TypeIFormatDescriptor(); - - status_t Init(usb_type_I_format_descriptor* Descriptor); - -// protected: - uint8 fNumChannels; - uint8 fSubframeSize; - uint8 fBitResolution; - uint8 fSampleFrequencyType; - Vector fSampleFrequencies; -}; - - -class TypeIIFormatDescriptor : public _ASFormatDescriptor { -public: - TypeIIFormatDescriptor(Device* device, size_t interface, - usb_type_II_format_descriptor* Descriptor); - virtual ~TypeIIFormatDescriptor(); - -// protected: - uint16 fMaxBitRate; - uint16 fSamplesPerFrame; - uint8 fSampleFrequencyType; - Vector fSampleFrequencies; -}; - - -class TypeIIIFormatDescriptor : public TypeIFormatDescriptor { -public: - TypeIIIFormatDescriptor(Device* device, size_t interface, - usb_type_III_format_descriptor* Descriptor); - virtual ~TypeIIIFormatDescriptor(); - -// protected: -}; - - -class AudioStreamAlternate { -public: - AudioStreamAlternate(size_t alternate, - ASInterfaceDescriptor* interface, - ASEndpointDescriptor* endpoint, - _ASFormatDescriptor* format); - ~AudioStreamAlternate(); - - ASInterfaceDescriptor* Interface() { return fInterface; } - ASEndpointDescriptor* Endpoint() { return fEndpoint; } - _ASFormatDescriptor* Format() { return fFormat; } - -protected: - size_t fAlternate; - ASInterfaceDescriptor* fInterface; - ASEndpointDescriptor* fEndpoint; - _ASFormatDescriptor* fFormat; -}; - -#endif // _AUDIO_FUNCTION_H_ - diff --git a/src/add-ons/kernel/drivers/audio/usb_audio/AudioStreamingInterface.cpp b/src/add-ons/kernel/drivers/audio/usb_audio/AudioStreamingInterface.cpp index 653dfaedc4..250f193461 100644 --- a/src/add-ons/kernel/drivers/audio/usb_audio/AudioStreamingInterface.cpp +++ b/src/add-ons/kernel/drivers/audio/usb_audio/AudioStreamingInterface.cpp @@ -5,10 +5,13 @@ * */ + #include "AudioStreamingInterface.h" -#include "Settings.h" -#include "Device.h" + + #include "audio.h" +#include "Driver.h" +#include "Settings.h" static struct RatePair { @@ -38,13 +41,12 @@ static struct RatePair { // Audio Stream information entities // // -ASInterfaceDescriptor::ASInterfaceDescriptor(/*Device* device, size_t interface,*/ - usb_as_interface_descriptor_r1* Descriptor) - : -// _AudioFunctionEntity(device, interface), - fTerminalLink(0), - fDelay(0), - fFormatTag(0) +ASInterfaceDescriptor::ASInterfaceDescriptor( + usb_as_interface_descriptor_r1* Descriptor) + : + fTerminalLink(0), + fDelay(0), + fFormatTag(0) { fTerminalLink = Descriptor->terminal_link; fDelay = Descriptor->delay; @@ -60,22 +62,21 @@ ASInterfaceDescriptor::ASInterfaceDescriptor(/*Device* device, size_t interface, ASInterfaceDescriptor::~ASInterfaceDescriptor() { - } ASEndpointDescriptor::ASEndpointDescriptor(usb_endpoint_descriptor* Endpoint, - usb_as_cs_endpoint_descriptor* Descriptor) - : - fCSAttributes(0), - fLockDelayUnits(0), - fLockDelay(0), - fMaxPacketSize(0), - fEndpointAddress(0), - fEndpointAttributes(0) + usb_as_cs_endpoint_descriptor* Descriptor) + : + fCSAttributes(0), + fLockDelayUnits(0), + fLockDelay(0), + fMaxPacketSize(0), + fEndpointAddress(0), + fEndpointAttributes(0) { -// usb_audiocontrol_header_descriptor *Header -// = (usb_audiocontrol_header_descriptor *)Interface->generic[i]; +// usb_audiocontrol_header_descriptor* Header +// = (usb_audiocontrol_header_descriptor*)Interface->generic[i]; fCSAttributes = Descriptor->attributes; fLockDelayUnits = Descriptor->lock_delay_units; @@ -100,10 +101,10 @@ ASEndpointDescriptor::~ASEndpointDescriptor() } -_ASFormatDescriptor::_ASFormatDescriptor(usb_type_I_format_descriptor* Descriptor) - : - /*_AudioFunctionEntity(device, interface)*/ - fFormatType(UAF_FORMAT_TYPE_UNDEFINED) +_ASFormatDescriptor::_ASFormatDescriptor( + usb_type_I_format_descriptor* Descriptor) + : + fFormatType(UAF_FORMAT_TYPE_UNDEFINED) { fFormatType = Descriptor->format_type; } @@ -121,14 +122,14 @@ _ASFormatDescriptor::GetSamFreq(uint8* freq) } -TypeIFormatDescriptor::TypeIFormatDescriptor(/*Device* device, size_t interface,*/ - usb_type_I_format_descriptor* Descriptor) - : - _ASFormatDescriptor(Descriptor), - fNumChannels(0), - fSubframeSize(0), - fBitResolution(0), - fSampleFrequencyType(0) +TypeIFormatDescriptor::TypeIFormatDescriptor( + usb_type_I_format_descriptor* Descriptor) + : + _ASFormatDescriptor(Descriptor), + fNumChannels(0), + fSubframeSize(0), + fBitResolution(0), + fSampleFrequencyType(0) { /*fStatus =*/ Init(Descriptor); } @@ -149,37 +150,34 @@ TypeIFormatDescriptor::Init(usb_type_I_format_descriptor* Descriptor) if (fSampleFrequencyType == 0) { fSampleFrequencies.PushBack( - GetSamFreq(Descriptor->sf.cont.lower_sam_freq)); + GetSamFreq(Descriptor->sf.cont.lower_sam_freq)); fSampleFrequencies.PushBack( - GetSamFreq(Descriptor->sf.cont.upper_sam_freq)); - } else { - for (size_t i = 0; i < fSampleFrequencyType; i++) { + GetSamFreq(Descriptor->sf.cont.upper_sam_freq)); + } else + for (size_t i = 0; i < fSampleFrequencyType; i++) fSampleFrequencies.PushBack( GetSamFreq(Descriptor->sf.discr.sam_freq[i])); - } - } TRACE("fNumChannels:%d\n", fNumChannels); TRACE("fSubframeSize:%d\n", fSubframeSize); TRACE("fBitResolution:%d\n", fBitResolution); TRACE("fSampleFrequencyType:%d\n", fSampleFrequencyType); - for (int32 i = 0; i < fSampleFrequencies.Count(); i++) { + for (int32 i = 0; i < fSampleFrequencies.Count(); i++) TRACE("Frequency #%d: %d\n", i, fSampleFrequencies[i]); - } return B_OK; } -TypeIIFormatDescriptor::TypeIIFormatDescriptor(/*Device* device, size_t interface,*/ - usb_type_II_format_descriptor* Descriptor) - : - _ASFormatDescriptor((usb_type_I_format_descriptor*)Descriptor), - fMaxBitRate(0), - fSamplesPerFrame(0), - fSampleFrequencyType(0), - fSampleFrequencies(0) +TypeIIFormatDescriptor::TypeIIFormatDescriptor( + usb_type_II_format_descriptor* Descriptor) + : + _ASFormatDescriptor((usb_type_I_format_descriptor*)Descriptor), + fMaxBitRate(0), + fSamplesPerFrame(0), + fSampleFrequencyType(0), + fSampleFrequencies(0) { } @@ -189,13 +187,11 @@ TypeIIFormatDescriptor::~TypeIIFormatDescriptor() } -TypeIIIFormatDescriptor::TypeIIIFormatDescriptor(/*Device* device, size_t interface,*/ - usb_type_III_format_descriptor* Descriptor) - : - TypeIFormatDescriptor(/*device, interface, */ - (usb_type_I_format_descriptor*) Descriptor) +TypeIIIFormatDescriptor::TypeIIIFormatDescriptor( + usb_type_III_format_descriptor* Descriptor) + : + TypeIFormatDescriptor((usb_type_I_format_descriptor*)Descriptor) { - } @@ -205,17 +201,15 @@ TypeIIIFormatDescriptor::~TypeIIIFormatDescriptor() AudioStreamAlternate::AudioStreamAlternate(size_t alternate, - ASInterfaceDescriptor* interface, - ASEndpointDescriptor* endpoint, - _ASFormatDescriptor* format) - : - fAlternate(alternate), - fInterface(interface), - fEndpoint(endpoint), - fFormat(format), - fSamplingRate(0) + ASInterfaceDescriptor* interface, ASEndpointDescriptor* endpoint, + _ASFormatDescriptor* format) + : + fAlternate(alternate), + fInterface(interface), + fEndpoint(endpoint), + fFormat(format), + fSamplingRate(0) { - // SetSamplingRate(0); // init to default (max) sampling rate } @@ -269,7 +263,6 @@ AudioStreamAlternate::SetSamplingRate(uint32 newRate) } } -// newRate = fSamplingRate; return B_OK; } @@ -388,13 +381,13 @@ AudioStreamAlternate::SetFormatId(uint32 /*newFormatId*/) AudioStreamingInterface::AudioStreamingInterface( - AudioControlInterface* controlInterface, - size_t interface, usb_interface_list *List) - : - fInterface(interface), - fControlInterface(controlInterface), - fIsInput(false), - fActiveAlternate(0) + AudioControlInterface* controlInterface, + size_t interface, usb_interface_list* List) + : + fInterface(interface), + fControlInterface(controlInterface), + fIsInput(false), + fActiveAlternate(0) { TRACE_ALWAYS("if[%d]:alt_count:%d\n", interface, List->alt_count); @@ -403,34 +396,33 @@ AudioStreamingInterface::AudioStreamingInterface( ASEndpointDescriptor* ASEndpoint = NULL; _ASFormatDescriptor* ASFormat = NULL; - usb_interface_info *Interface = &List->alt[alt]; + usb_interface_info* Interface = &List->alt[alt]; TRACE_ALWAYS("if[%d]:alt[%d]:descrs_count:%d\n", - interface, alt, Interface->generic_count); + interface, alt, Interface->generic_count); for (size_t i = 0; i < Interface->generic_count; i++) { - usb_audiocontrol_header_descriptor *Header - = (usb_audiocontrol_header_descriptor *)Interface->generic[i]; + usb_audiocontrol_header_descriptor* Header + = (usb_audiocontrol_header_descriptor*)Interface->generic[i]; if (Header->descriptor_type == AC_CS_INTERFACE) { switch(Header->descriptor_subtype) { case UAS_AS_GENERAL: - if (ASInterface == 0) { + if (ASInterface == 0) ASInterface = new ASInterfaceDescriptor( - /*this, interface, */ - (usb_as_interface_descriptor_r1*) Header); - } else + (usb_as_interface_descriptor_r1*) Header); + else TRACE_ALWAYS("Duplicate AStream interface ignored.\n"); break; case UAS_FORMAT_TYPE: - if (ASFormat == 0) { + if (ASFormat == 0) ASFormat = new TypeIFormatDescriptor( - (usb_type_I_format_descriptor*) Header); - } else + (usb_type_I_format_descriptor*) Header); + else TRACE_ALWAYS("Duplicate AStream format ignored.\n"); break; default: TRACE_ALWAYS("Ignore AStream descr subtype %#04x\n", - Header->descriptor_subtype); + Header->descriptor_subtype); break; } continue; @@ -439,9 +431,9 @@ AudioStreamingInterface::AudioStreamingInterface( if (Header->descriptor_type == AC_CS_ENDPOINT) { if (ASEndpoint == 0) { usb_endpoint_descriptor* Endpoint - = Interface->endpoint[0].descr; + = Interface->endpoint[0].descr; ASEndpoint = new ASEndpointDescriptor(Endpoint, - (usb_as_cs_endpoint_descriptor*)Header); + (usb_as_cs_endpoint_descriptor*)Header); } else TRACE_ALWAYS("Duplicate AStream endpoint ignored.\n"); continue; @@ -452,21 +444,18 @@ AudioStreamingInterface::AudioStreamingInterface( } fAlternates.Add(new AudioStreamAlternate(alt, ASInterface, - ASEndpoint, ASFormat)); + ASEndpoint, ASFormat)); } } AudioStreamingInterface::~AudioStreamingInterface() { - // alternates of the streams -// StreamAlternatesVector fAlternates; -// size_t fActiveAlternate; // we own stream header objects too, so free them - for (StreamAlternatesIterator I = fAlternates.Begin(); - I != fAlternates.End(); I++) { + for (Vector::Iterator I = fAlternates.Begin(); + I != fAlternates.End(); I++) delete *I; - } + fAlternates.MakeEmpty(); } @@ -474,10 +463,8 @@ AudioStreamingInterface::~AudioStreamingInterface() uint8 AudioStreamingInterface::TerminalLink() { - if (fAlternates[fActiveAlternate]->Interface() != 0) { + if (fAlternates[fActiveAlternate]->Interface() != 0) return fAlternates[fActiveAlternate]->Interface()->fTerminalLink; - } - return 0; } @@ -496,71 +483,12 @@ AudioStreamingInterface::ChannelCluster() } -/* -ASInterfaceDescriptor* -Stream::ASInterface() -{ - return fAlternates[fActiveAlternate]->Interface(); -} - - -_ASFormatDescriptor* -Stream::ASFormat() -{ - return fAlternates[fActiveAlternate]->Format(); -} */ - void -AudioStreamingInterface::GetFormatsAndRates(multi_description *Description) +AudioStreamingInterface::GetFormatsAndRates(multi_description* Description) { - // TODO: fIsInput ?????? Description->interface_flags |= fIsInput ? B_MULTI_INTERFACE_RECORD : B_MULTI_INTERFACE_PLAYBACK; -// uint32 rates = 0; -/* - TypeIFormatDescriptor* format - = static_cast( - fAlternates[fActiveAlternate]->Format()); - - if (format == NULL || fAlternates[fActiveAlternate]->Interface() == NULL) { - TRACE_ALWAYS("Ignore alternate %d due format " - "%#08x or interface %#08x null.\n", fActiveAlternate, format, - fAlternates[fActiveAlternate]->Interface()); - } - - if (format->fSampleFrequencyType == 0) { // continuous frequencies - rates = B_SR_CVSR; - Description->min_cvsr_rate = float(format->fSampleFrequencies[0]); - Description->max_cvsr_rate = float(format->fSampleFrequencies[1]); - } else { - for (int i = 0; i < format->fSampleFrequencies.Count(); i++) { - switch(format->fSampleFrequencies[i]) { - case 8000: rates |= B_SR_8000; break; - case 11025: rates |= B_SR_11025; break; - case 12000: rates |= B_SR_12000; break; - case 16000: rates |= B_SR_16000; break; - case 22050: rates |= B_SR_22050; break; - case 24000: rates |= B_SR_24000; break; - case 32000: rates |= B_SR_32000; break; - case 44100: rates |= B_SR_44100; break; - case 48000: rates |= B_SR_48000; break; - case 64000: rates |= B_SR_64000; break; - case 88200: rates |= B_SR_88200; break; - case 96000: rates |= B_SR_96000; break; - case 176400: rates |= B_SR_176400; break; - case 192000: rates |= B_SR_192000; break; - case 384000: rates |= B_SR_384000; break; - case 1536000: rates |= B_SR_1536000; break; - default: - TRACE_ALWAYS("Ignore unsupported " - "sample rate %d for alternate %d.\n", - format->fSampleFrequencies[i], fActiveAlternate); - break; - } - } - } -*/ uint32 rates = fAlternates[fActiveAlternate]->GetSamplingRateIds(); uint32 formats = fAlternates[fActiveAlternate]->GetFormatId(); diff --git a/src/add-ons/kernel/drivers/audio/usb_audio/AudioStreamingInterface.h b/src/add-ons/kernel/drivers/audio/usb_audio/AudioStreamingInterface.h index 0815c9e613..d747b58c8b 100644 --- a/src/add-ons/kernel/drivers/audio/usb_audio/AudioStreamingInterface.h +++ b/src/add-ons/kernel/drivers/audio/usb_audio/AudioStreamingInterface.h @@ -1,6 +1,6 @@ /* * Driver for USB Audio Device Class devices. - * Copyright (c) 2009,10,12 S.Zharski + * Copyright (c) 2009-13 S.Zharski * Distributed under the terms of the MIT license. * */ @@ -8,31 +8,27 @@ #define _AUDIO_STREAMING_INTERFACE_H_ -#include "Driver.h" -#include "AudioControlInterface.h" - #include +#include + +#include "AudioControlInterface.h" #include "USB_audio_spec.h" -// -// Audio Streaming Interface information entities -// -// -class ASInterfaceDescriptor /*: public _AudioFunctionEntity*/ { +class ASInterfaceDescriptor { public: - ASInterfaceDescriptor(/*Device* device, size_t interface,*/ + ASInterfaceDescriptor( usb_as_interface_descriptor_r1* Descriptor); ~ASInterfaceDescriptor(); // protected: - uint8 fTerminalLink; - uint8 fDelay; - uint16 fFormatTag; + uint8 fTerminalLink; + uint8 fDelay; + uint16 fFormatTag; }; -class ASEndpointDescriptor /*: public _AudioFunctionEntity*/ { +class ASEndpointDescriptor { public: ASEndpointDescriptor( usb_endpoint_descriptor* Endpoint, @@ -40,63 +36,63 @@ public: ~ASEndpointDescriptor(); // protected: - uint8 fCSAttributes; - uint8 fLockDelayUnits; - uint16 fLockDelay; - uint16 fMaxPacketSize; - uint8 fEndpointAddress; - uint8 fEndpointAttributes; + uint8 fCSAttributes; + uint8 fLockDelayUnits; + uint16 fLockDelay; + uint16 fMaxPacketSize; + uint8 fEndpointAddress; + uint8 fEndpointAttributes; }; -class _ASFormatDescriptor /*: public _AudioFunctionEntity*/ { +class _ASFormatDescriptor { public: _ASFormatDescriptor( - usb_type_I_format_descriptor* Descriptor); - virtual ~_ASFormatDescriptor(); + usb_type_I_format_descriptor* Descriptor); + virtual ~_ASFormatDescriptor(); // protected: - uint8 fFormatType; - uint32 GetSamFreq(uint8* freq); + uint8 fFormatType; + uint32 GetSamFreq(uint8* freq); }; class TypeIFormatDescriptor : public _ASFormatDescriptor { public: - TypeIFormatDescriptor(/*Device* device, size_t interface,*/ + TypeIFormatDescriptor( usb_type_I_format_descriptor* Descriptor); - virtual ~TypeIFormatDescriptor(); + virtual ~TypeIFormatDescriptor(); - status_t Init(usb_type_I_format_descriptor* Descriptor); + status_t Init(usb_type_I_format_descriptor* Descriptor); // protected: - uint8 fNumChannels; - uint8 fSubframeSize; - uint8 fBitResolution; - uint8 fSampleFrequencyType; - Vector fSampleFrequencies; + uint8 fNumChannels; + uint8 fSubframeSize; + uint8 fBitResolution; + uint8 fSampleFrequencyType; + Vector fSampleFrequencies; }; class TypeIIFormatDescriptor : public _ASFormatDescriptor { public: - TypeIIFormatDescriptor(/*Device* device, size_t interface,*/ + TypeIIFormatDescriptor( usb_type_II_format_descriptor* Descriptor); - virtual ~TypeIIFormatDescriptor(); + virtual ~TypeIIFormatDescriptor(); // protected: - uint16 fMaxBitRate; - uint16 fSamplesPerFrame; - uint8 fSampleFrequencyType; - Vector fSampleFrequencies; + uint16 fMaxBitRate; + uint16 fSamplesPerFrame; + uint8 fSampleFrequencyType; + Vector fSampleFrequencies; }; class TypeIIIFormatDescriptor : public TypeIFormatDescriptor { public: - TypeIIIFormatDescriptor(/*Device* device, size_t interface, */ + TypeIIIFormatDescriptor( usb_type_III_format_descriptor* Descriptor); - virtual ~TypeIIIFormatDescriptor(); + virtual ~TypeIIIFormatDescriptor(); // protected: }; @@ -104,63 +100,59 @@ public: class AudioStreamAlternate { public: - AudioStreamAlternate(size_t alternate, + AudioStreamAlternate(size_t alternate, ASInterfaceDescriptor* interface, ASEndpointDescriptor* endpoint, _ASFormatDescriptor* format); - ~AudioStreamAlternate(); + ~AudioStreamAlternate(); - ASInterfaceDescriptor* Interface() { return fInterface; } - ASEndpointDescriptor* Endpoint() { return fEndpoint; } - _ASFormatDescriptor* Format() { return fFormat; } + ASInterfaceDescriptor* Interface() { return fInterface; } + ASEndpointDescriptor* Endpoint() { return fEndpoint; } + _ASFormatDescriptor* Format() { return fFormat; } - status_t SetSamplingRate(uint32 newRate); - status_t SetSamplingRateById(uint32 newId); - uint32 GetSamplingRate() { return fSamplingRate; } - uint32 GetSamplingRateId(uint32 rate); - uint32 GetSamplingRateIds(); - uint32 GetFormatId(); - status_t SetFormatId(uint32 newFormatId); - uint32 SamplingRateFromId(uint32 id); + status_t SetSamplingRate(uint32 newRate); + status_t SetSamplingRateById(uint32 newId); + uint32 GetSamplingRate() { return fSamplingRate; } + uint32 GetSamplingRateId(uint32 rate); + uint32 GetSamplingRateIds(); + uint32 GetFormatId(); + status_t SetFormatId(uint32 newFormatId); + uint32 SamplingRateFromId(uint32 id); protected: - size_t fAlternate; - ASInterfaceDescriptor* fInterface; - ASEndpointDescriptor* fEndpoint; - _ASFormatDescriptor* fFormat; - uint32 fSamplingRate; + size_t fAlternate; + ASInterfaceDescriptor* fInterface; + ASEndpointDescriptor* fEndpoint; + _ASFormatDescriptor* fFormat; + uint32 fSamplingRate; }; -typedef Vector StreamAlternatesVector; -typedef Vector::Iterator StreamAlternatesIterator; - - class AudioStreamingInterface { public: - AudioStreamingInterface( - AudioControlInterface* controlInterface, - size_t interface, usb_interface_list *List); - ~AudioStreamingInterface(); + AudioStreamingInterface( + AudioControlInterface* controlInterface, + size_t interface, usb_interface_list* List); + ~AudioStreamingInterface(); - // status_t InitCheck() { return fStatus; } - uint8 TerminalLink(); - bool IsInput() { return fIsInput; } + // status_t InitCheck() { return fStatus; } + uint8 TerminalLink(); + bool IsInput() { return fIsInput; } - AudioChannelCluster* ChannelCluster(); - - void GetFormatsAndRates(multi_description *Description); + AudioChannelCluster* ChannelCluster(); + void GetFormatsAndRates( + multi_description* Description); protected: - size_t fInterface; - AudioControlInterface* fControlInterface; + size_t fInterface; + AudioControlInterface* fControlInterface; - // status_t fStatus; - bool fIsInput; + // status_t fStatus; + bool fIsInput; // alternates of the streams - StreamAlternatesVector fAlternates; - size_t fActiveAlternate; + Vector fAlternates; + size_t fActiveAlternate; }; diff --git a/src/add-ons/kernel/drivers/audio/usb_audio/Device.cpp b/src/add-ons/kernel/drivers/audio/usb_audio/Device.cpp index 8bc20553fd..95ae75436a 100644 --- a/src/add-ons/kernel/drivers/audio/usb_audio/Device.cpp +++ b/src/add-ons/kernel/drivers/audio/usb_audio/Device.cpp @@ -1,36 +1,27 @@ /* * Driver for USB Audio Device Class devices. - * Copyright (c) 2009,10,12 S.Zharski + * Copyright (c) 2009-13 S.Zharski * Distributed under the terms of the MIT license. * */ -#include "Driver.h" -#include "Device.h" -#include "Settings.h" -//#include "audio.h" -#include "AudioStreamingInterface.h" -// #include "StreamFormats.h" -#include +#include "Device.h" + +#include "Driver.h" +#include "Settings.h" + Device::Device(usb_device device) - : - fStatus(B_ERROR), - fOpen(false), - fRemoved(false), - fInsideNotify(0), - fDevice(device), - fNonBlocking(false), - fAudioControl(this), - // fControlEndpoint(0), - // fInStreamEndpoint(0), - // fOutStreamEndpoint(0), - fNotifyReadSem(-1), - fNotifyWriteSem(-1), - fNotifyBuffer(NULL), - fNotifyBufferLength(0), - fBuffersReadySem(-1) + : + fStatus(B_ERROR), + fOpen(false), + fRemoved(false), +// fInsideNotify(0), + fDevice(device), + fNonBlocking(false), + fAudioControl(this), + fBuffersReadySem(-1) { const usb_device_descriptor* deviceDescriptor = gUSBModule->get_device_descriptor(device); @@ -44,30 +35,15 @@ Device::Device(usb_device device) fProductID = deviceDescriptor->product_id; fUSBVersion = deviceDescriptor->usb_version; - fNotifyReadSem = create_sem(0, DRIVER_NAME"_notify_read"); - if (fNotifyReadSem < B_OK) { - TRACE_ALWAYS("Error of creating read notify semaphore:%#010x\n", - fNotifyReadSem); - return; - } - - fNotifyWriteSem = create_sem(0, DRIVER_NAME"_notify_write"); - if (fNotifyWriteSem < B_OK) { - TRACE_ALWAYS("Error of creating write notify semaphore:%#010x\n", - fNotifyWriteSem); - return; - } - fBuffersReadySem = create_sem(0, DRIVER_NAME "_buffers_ready"); if (fBuffersReadySem < B_OK) { - TRACE_ALWAYS("Error of creating ready buffers semaphore:%#010x\n", - fBuffersReadySem); + TRACE_ALWAYS("Error of creating ready " + "buffers semaphore:%#010x\n", fBuffersReadySem); return; } - if (_SetupEndpoints() != B_OK) { + if (_SetupEndpoints() != B_OK) return; - } // must be set in derived class constructor fStatus = B_OK; @@ -76,40 +52,14 @@ Device::Device(usb_device device) Device::~Device() { - // we have to clear because we own those objects here -/* - for (AudioControlsIterator I = fAudioControls.Begin(); - I != fAudioControls.End(); I++) { - delete I->Value(); - } - fAudioControls.MakeEmpty(); - - // object already freed. just purge the map - fOutputTerminals.MakeEmpty(); - - // object already freed. just purge the map - fInputTerminals.MakeEmpty(); -*/ - // free stream objects too. - for (AudioStreamsIterator I = fStreams.Begin(); - I != fStreams.End(); I++) { + for (Vector::Iterator I = fStreams.Begin(); + I != fStreams.End(); I++) delete *I; - } - fStreams.MakeEmpty(); - if (fNotifyReadSem >= B_OK) - delete_sem(fNotifyReadSem); - if (fNotifyWriteSem >= B_OK) - delete_sem(fNotifyWriteSem); + fStreams.MakeEmpty(); if (fBuffersReadySem > B_OK) delete_sem(fBuffersReadySem); - -// if (!fRemoved) // ??? -// gUSBModule->cancel_queued_transfers(fNotifyEndpoint); - - if (fNotifyBuffer) - free(fNotifyBuffer); } @@ -122,19 +72,10 @@ Device::Open(uint32 flags) return B_ERROR; status_t result = StartDevice(); - if (result != B_OK) { + if (result != B_OK) return result; - } - - // setup state notifications -/* result = gUSBModule->queue_interrupt(fNotifyEndpoint, fNotifyBuffer, - fNotifyBufferLength, _NotifyCallback, this); - if (result != B_OK) { - TRACE_ALWAYS("Error of requesting notify interrupt:%#010x\n", result); - return result; - } -*/ + // TODO: are we need this??? fNonBlocking = (flags & O_NONBLOCK) == O_NONBLOCK; fOpen = true; return result; @@ -149,13 +90,12 @@ Device::Close() return B_OK; } - for (int i = 0; i < fStreams.Count(); i++) { + for (int i = 0; i < fStreams.Count(); i++) fStreams[i]->Stop(); - } // wait until possible notification handling finished... - while (atomic_add(&fInsideNotify, 0) != 0) - snooze(100); +// while (atomic_add(&fInsideNotify, 0) != 0) +// snooze(100); // gUSBModule->cancel_queued_transfers(fControlEndpoint); // gUSBModule->cancel_queued_transfers(fInStreamEndpoint); // gUSBModule->cancel_queued_transfers(fOutStreamEndpoint); @@ -174,7 +114,7 @@ Device::Free() status_t -Device::Read(uint8 *buffer, size_t *numBytes) +Device::Read(uint8* buffer, size_t* numBytes) { *numBytes = 0; return B_IO_ERROR; @@ -182,7 +122,7 @@ Device::Read(uint8 *buffer, size_t *numBytes) status_t -Device::Write(const uint8 *buffer, size_t *numBytes) +Device::Write(const uint8* buffer, size_t* numBytes) { *numBytes = 0; return B_IO_ERROR; @@ -190,7 +130,7 @@ Device::Write(const uint8 *buffer, size_t *numBytes) status_t -Device::Control(uint32 op, void *buffer, size_t length) +Device::Control(uint32 op, void* buffer, size_t length) { switch (op) { case B_MULTI_GET_DESCRIPTION: @@ -224,15 +164,15 @@ Device::Control(uint32 op, void *buffer, size_t length) TRACE(("B_MULTI_GET_CHANNEL_FORMATS\n")); return B_ERROR; - case B_MULTI_SET_CHANNEL_FORMATS: /* only implemented if possible */ + case B_MULTI_SET_CHANNEL_FORMATS: TRACE(("B_MULTI_SET_CHANNEL_FORMATS\n")); return B_ERROR; case B_MULTI_GET_MIX: - return _MultiGetMix((multi_mix_value_info *)buffer); + return _MultiGetMix((multi_mix_value_info*)buffer); case B_MULTI_SET_MIX: - return _MultiSetMix((multi_mix_value_info *)buffer); + return _MultiSetMix((multi_mix_value_info*)buffer); case B_MULTI_LIST_MIX_CHANNELS: TRACE(("B_MULTI_LIST_MIX_CHANNELS\n")); @@ -279,7 +219,6 @@ void Device::Removed() { fRemoved = true; -// fHasConnection = false; // the notify hook is different from the read and write hooks as it does // itself schedule traffic (while the other hooks only release a semaphore @@ -287,16 +226,13 @@ Device::Removed() // case) - so we must ensure that we are not inside the notify hook anymore // before returning, as we would otherwise violate the promise not to use // any of the pipes after returning from the removed hook - while (atomic_add(&fInsideNotify, 0) != 0) - snooze(100); +// TODO?????? +// while (atomic_add(&fInsideNotify, 0) != 0) +// snooze(100); // gUSBModule->cancel_queued_transfers(fControlEndpoint); // gUSBModule->cancel_queued_transfers(fInStreamEndpoint); // gUSBModule->cancel_queued_transfers(fOutStreamEndpoint); -/* - if (fLinkStateChangeSem >= B_OK) - release_sem_etc(fLinkStateChangeSem, 1, B_DO_NOT_RESCHEDULE); -*/ } @@ -310,7 +246,7 @@ Device::SetupDevice(bool deviceReplugged) status_t Device::CompareAndReattach(usb_device device) { - const usb_device_descriptor *deviceDescriptor + const usb_device_descriptor* deviceDescriptor = gUSBModule->get_device_descriptor(device); if (deviceDescriptor == NULL) { @@ -319,10 +255,9 @@ Device::CompareAndReattach(usb_device device) } if (deviceDescriptor->vendor_id != fVendorID - && deviceDescriptor->product_id != fProductID) { + && deviceDescriptor->product_id != fProductID) // this certainly isn't the same device return B_BAD_VALUE; - } // this is the same device that was replugged - clear the removed state, // re- setup the endpoints and transfers and open the device if it was @@ -337,9 +272,8 @@ Device::CompareAndReattach(usb_device device) // we need to setup hardware on device replug result = SetupDevice(true); - if (result != B_OK) { + if (result != B_OK) return result; - } if (fOpen) { fOpen = false; @@ -351,51 +285,50 @@ Device::CompareAndReattach(usb_device device) status_t -Device::_MultiGetDescription(multi_description *multiDescription) +Device::_MultiGetDescription(multi_description* multiDescription) { multi_description Description; if (user_memcpy(&Description, multiDescription, - sizeof(multi_description)) != B_OK) { + sizeof(multi_description)) != B_OK) return B_BAD_ADDRESS; - } Description.interface_version = B_CURRENT_INTERFACE_VERSION; Description.interface_minimum = B_CURRENT_INTERFACE_VERSION; - strlcpy(Description.friendly_name, "USB Audio", // TODO: ???? - sizeof(Description.friendly_name)); + strlcpy(Description.friendly_name, "USB Audio", + sizeof(Description.friendly_name)); strlcpy(Description.vendor_info, "S.Zharski", - sizeof(Description.vendor_info)); + sizeof(Description.vendor_info)); - Description.output_channel_count = 0; - Description.input_channel_count = 0; - Description.output_bus_channel_count = 0; - Description.input_bus_channel_count = 0; - Description.aux_bus_channel_count = 0; + Description.output_channel_count = 0; + Description.input_channel_count = 0; + Description.output_bus_channel_count = 0; + Description.input_bus_channel_count = 0; + Description.aux_bus_channel_count = 0; - Description.output_rates = 0; - Description.input_rates = 0; + Description.output_rates = 0; + Description.input_rates = 0; Description.min_cvsr_rate = 0; Description.max_cvsr_rate = 0; - Description.output_formats = 0; - Description.input_formats = 0; - Description.lock_sources = B_MULTI_LOCK_INTERNAL; + Description.output_formats = 0; + Description.input_formats = 0; + Description.lock_sources = B_MULTI_LOCK_INTERNAL; Description.timecode_sources = 0; - Description.interface_flags = 0; - Description.start_latency = 3000; + Description.interface_flags = 0; + Description.start_latency = 3000; Description.control_panel[0] = '\0'; - AudioControlsVector USBTerminals; + Vector<_AudioControl*> USBTerminals; // channels (USB I/O terminals) are already in fStreams // in outputs->inputs order, use them. for (int i = 0; i < fStreams.Count(); i++) { uint8 id = fStreams[i]->TerminalLink(); - _AudioControl *control = fAudioControl.Find(id); + _AudioControl* control = fAudioControl.Find(id); // if (control->SubType() == IDSOutputTerminal) { // USBTerminals.PushFront(control); // fStreams[i]->GetFormatsAndRates(Description); @@ -406,35 +339,29 @@ Device::_MultiGetDescription(multi_description *multiDescription) // } } - // int32 index = 0; Vector Channels; - /*uint32 channels =*/ fAudioControl.GetChannelsDescription(Channels, &Description, USBTerminals); - /*uint32 bus_channels =*/ fAudioControl.GetBusChannelsDescription(Channels, &Description ); + fAudioControl.GetChannelsDescription(Channels, &Description, USBTerminals); + fAudioControl.GetBusChannelsDescription(Channels, &Description ); // Description.request_channel_count = channels + bus_channels; TraceMultiDescription(&Description, Channels); if (user_memcpy(multiDescription, &Description, - sizeof(multi_description)) != B_OK) { + sizeof(multi_description)) != B_OK) return B_BAD_ADDRESS; - } - // if (Description.request_channel_count >= - // (int)(sizeof(channel_descriptions) / sizeof(channel_descriptions[0]))) - // { if (user_memcpy(multiDescription->channels, &Channels[0], min_c(Channels.Count(), Description.request_channel_count)) != B_OK) return B_BAD_ADDRESS; - // } return B_OK; } void -Device::TraceMultiDescription(multi_description *Description, +Device::TraceMultiDescription(multi_description* Description, Vector& Channels) { TRACE("interface_version:%d\n", Description->interface_version); @@ -472,36 +399,34 @@ Device::TraceMultiDescription(multi_description *Description, status_t -Device::_MultiGetEnabledChannels(multi_channel_enable *Enable) +Device::_MultiGetEnabledChannels(multi_channel_enable* Enable) { status_t status = B_OK; Enable->lock_source = B_MULTI_LOCK_INTERNAL; uint32 offset = 0; - for (int i = 0; i < fStreams.Count() && status == B_OK; i++) { + for (int i = 0; i < fStreams.Count() && status == B_OK; i++) status = fStreams[i]->GetEnabledChannels(offset, Enable); - } return status; } status_t -Device::_MultiSetEnabledChannels(multi_channel_enable *Enable) +Device::_MultiSetEnabledChannels(multi_channel_enable* Enable) { status_t status = B_OK; uint32 offset = 0; - for (int i = 0; i < fStreams.Count() && status == B_OK; i++) { + for (int i = 0; i < fStreams.Count() && status == B_OK; i++) status = fStreams[i]->SetEnabledChannels(offset, Enable); - } return status; } status_t -Device::_MultiGetGlobalFormat(multi_format_info *Format) +Device::_MultiGetGlobalFormat(multi_format_info* Format) { status_t status = B_OK; @@ -510,16 +435,15 @@ Device::_MultiGetGlobalFormat(multi_format_info *Format) Format->timecode_kind = 0; // uint32 offset = 0; - for (int i = 0; i < fStreams.Count() && status == B_OK; i++) { + for (int i = 0; i < fStreams.Count() && status == B_OK; i++) status = fStreams[i]->GetGlobalFormat(Format); - } return status; } status_t -Device::_MultiSetGlobalFormat(multi_format_info *Format) +Device::_MultiSetGlobalFormat(multi_format_info* Format) { status_t status = B_OK; @@ -528,9 +452,8 @@ Device::_MultiSetGlobalFormat(multi_format_info *Format) TRACE("timecode_kind:%#08x\n", Format->timecode_kind); // uint32 offset = 0; - for (int i = 0; i < fStreams.Count() && status == B_OK; i++) { + for (int i = 0; i < fStreams.Count() && status == B_OK; i++) status = fStreams[i]->SetGlobalFormat(Format); - } return status; } @@ -559,10 +482,9 @@ Device::_MultiGetBuffers(multi_buffer_list* List) List->flags = 0; List->return_playback_channels = 0; List->return_record_channels = 0; - - for (int i = 0; i < fStreams.Count() && status == B_OK; i++) { + + for (int i = 0; i < fStreams.Count() && status == B_OK; i++) status = fStreams[i]->GetBuffers(List); - } return B_OK; } @@ -575,17 +497,10 @@ Device::_MultiBufferExchange(multi_buffer_info* multiInfo) if (user_memcpy(&Info, multiInfo, sizeof(multi_buffer_info)) != B_OK) return B_BAD_ADDRESS; - for (int i = 0; i < fStreams.Count(); i++) { - if (!fStreams[i]->IsRunning()) { + for (int i = 0; i < fStreams.Count(); i++) + if (!fStreams[i]->IsRunning()) fStreams[i]->Start(); - } - } -// TRACE_ALWAYS("Exchange!\n"); -/* - snooze(1000000); - return B_OK; -*/ status_t status = B_ERROR; bool anyBufferProcessed = false; for (int i = 0; i < fStreams.Count() && !anyBufferProcessed; i++) { @@ -610,22 +525,21 @@ Device::_MultiBufferExchange(multi_buffer_info* multiInfo) status_t Device::_MultiBufferForceStop() { - for (int i = 0; i < fStreams.Count(); i++) { + for (int i = 0; i < fStreams.Count(); i++) fStreams[i]->Stop(); - } return B_OK; } status_t -Device::_MultiGetMix(multi_mix_value_info *Info) +Device::_MultiGetMix(multi_mix_value_info* Info) { return fAudioControl.GetMix(Info); } status_t -Device::_MultiSetMix(multi_mix_value_info *Info) +Device::_MultiSetMix(multi_mix_value_info* Info) { return fAudioControl.SetMix(Info); } @@ -641,7 +555,7 @@ Device::_MultiListMixControls(multi_mix_control_info* Info) void -Device::TraceListMixControls(multi_mix_control_info *Info) +Device::TraceListMixControls(multi_mix_control_info* Info) { TRACE("control_count:%d\n.", Info->control_count); @@ -662,7 +576,7 @@ Device::TraceListMixControls(multi_mix_control_info *Info) status_t Device::_SetupEndpoints() { - const usb_configuration_info *config + const usb_configuration_info* config = gUSBModule->get_nth_configuration(fDevice, 0); if (config == NULL) { @@ -676,10 +590,9 @@ Device::_SetupEndpoints() } for (size_t i = 0; i < config->interface_count; i++) { - usb_interface_info *Interface = config->interface[i].active; - if (Interface->descr->interface_class != UAS_AUDIO) { + usb_interface_info* Interface = config->interface[i].active; + if (Interface->descr->interface_class != UAS_AUDIO) continue; - } switch (Interface->descr->interface_subclass) { case UAS_AUDIOCONTROL: @@ -687,23 +600,21 @@ Device::_SetupEndpoints() break; case UAS_AUDIOSTREAMING: { - Stream *stream = new Stream(this, i, &config->interface[i]); + Stream* stream = new Stream(this, i, &config->interface[i]); if (B_OK == stream->Init()) { // put the stream in the correct order: // first output that input ones. - if (stream->IsInput()) { + if (stream->IsInput()) fStreams.PushBack(stream); - } else { + else fStreams.PushFront(stream); - } - } else { + } else delete stream; - } } break; default: TRACE_ALWAYS("Ignore interface of unsupported subclass %#x.\n", - Interface->descr->interface_subclass); + Interface->descr->interface_subclass); break; } } @@ -712,9 +623,8 @@ Device::_SetupEndpoints() TRACE("Found device %#06x:%#06x\n", fVendorID, fProductID); gUSBModule->set_configuration(fDevice, config); - for (int i = 0; i < fStreams.Count(); i++) { + for (int i = 0; i < fStreams.Count(); i++) fStreams[i]->OnSetConfiguration(fDevice, config); - } return B_OK; } @@ -728,58 +638,33 @@ Device::StopDevice() { status_t result = B_OK; - if (result != B_OK) { + if (result != B_OK) TRACE_ALWAYS("Error of writing %#04x RX Control:%#010x\n", 0, result); - } TRACE_RET(result); return result; } -void -Device::_ReadCallback(void *cookie, int32 status, void *data, +/*void +Device::_NotifyCallback(void* cookie, int32 status, void* data, uint32 actualLength) { - TRACE_FLOW("ReadCB: %d bytes; status:%#010x\n", actualLength, status); - Device *device = (Device *)cookie; - device->fActualLengthRead = actualLength; - device->fStatusRead = status; - release_sem_etc(device->fNotifyReadSem, 1, B_DO_NOT_RESCHEDULE); -} - - -void -Device::_WriteCallback(void *cookie, int32 status, void *data, - uint32 actualLength) -{ - TRACE_FLOW("WriteCB: %d bytes; status:%#010x\n", actualLength, status); - Device *device = (Device *)cookie; - device->fActualLengthWrite = actualLength; - device->fStatusWrite = status; - release_sem_etc(device->fNotifyWriteSem, 1, B_DO_NOT_RESCHEDULE); -} - - -void -Device::_NotifyCallback(void *cookie, int32 status, void *data, - uint32 actualLength) -{ - Device *device = (Device *)cookie; + Device* device = (Device*)cookie; atomic_add(&device->fInsideNotify, 1); if (status == B_CANCELED || device->fRemoved) { atomic_add(&device->fInsideNotify, -1); return; } -/* if (status != B_OK) { +/ * if (status != B_OK) { TRACE_ALWAYS("Device status error:%#010x\n", status); status_t result = gUSBModule->clear_feature(device->fControLeNDPOint, USB_FEATURE_ENDPOINT_HALT); if (result != B_OK) TRACE_ALWAYS("Error during clearing of HALT state:%#010x.\n", result); } -*/ +* / // parse data in overriden class // device->OnNotify(actualLength); @@ -788,4 +673,5 @@ Device::_NotifyCallback(void *cookie, int32 status, void *data, // device->fNotifyBufferLength, _NotifyCallback, device); atomic_add(&device->fInsideNotify, -1); } +*/ diff --git a/src/add-ons/kernel/drivers/audio/usb_audio/Device.h b/src/add-ons/kernel/drivers/audio/usb_audio/Device.h index facf3897a3..94d4f736ff 100644 --- a/src/add-ons/kernel/drivers/audio/usb_audio/Device.h +++ b/src/add-ons/kernel/drivers/audio/usb_audio/Device.h @@ -1,6 +1,6 @@ /* * Driver for USB Audio Device Class devices. - * Copyright (c) 2009,10,12 S.Zharski + * Copyright (c) 2009-13 S.Zharski * Distributed under the terms of the MIT license. * */ @@ -8,131 +8,80 @@ #define _USB_AUDIO_DEVICE_H_ -#include "Driver.h" -#include "USB_audio_spec.h" #include "AudioControlInterface.h" -#include "AudioStreamingInterface.h" #include "Stream.h" -// typedef VectorMap AudioControlsMap; -// typedef VectorMap::Iterator AudioControlsIterator; - -typedef Vector AudioStreamsVector; -typedef Vector::Iterator AudioStreamsIterator; - - -class FeatureUnit; class Device { - friend class FeatureUnit; - friend class Stream; + friend class Stream; + public: Device(usb_device device); - virtual ~Device(); + virtual ~Device(); - status_t InitCheck() { return fStatus; }; + status_t InitCheck() { return fStatus; }; - status_t Open(uint32 flags); - bool IsOpen() { return fOpen; }; + status_t Open(uint32 flags); + bool IsOpen() { return fOpen; }; - status_t Close(); - status_t Free(); + status_t Close(); + status_t Free(); - status_t Read(uint8 *buffer, size_t *numBytes); - status_t Write(const uint8 *buffer, size_t *numBytes); - status_t Control(uint32 op, void *buffer, size_t length); + status_t Read(uint8* buffer, size_t* numBytes); + status_t Write(const uint8* buffer, size_t* numBytes); + status_t Control(uint32 op, void* buffer, size_t length); - void Removed(); - bool IsRemoved() { return fRemoved; }; + void Removed(); + bool IsRemoved() { return fRemoved; }; - status_t CompareAndReattach(usb_device device); -virtual status_t SetupDevice(bool deviceReplugged); -// uint16 SpecReleaseNumber(); - -// _AudioControl* FindAudioControl(uint8 ID); - usb_device USBDevice() { return fDevice; } + status_t CompareAndReattach(usb_device device); + virtual status_t SetupDevice(bool deviceReplugged); - AudioControlInterface& AudioControl() { return fAudioControl; } + usb_device USBDevice() { return fDevice; } + + AudioControlInterface& + AudioControl() { return fAudioControl; } private: -static void _ReadCallback(void *cookie, int32 status, - void *data, uint32 actualLength); -static void _WriteCallback(void *cookie, int32 status, - void *data, uint32 actualLength); -static void _NotifyCallback(void *cookie, int32 status, - void *data, uint32 actualLength); + status_t _SetupEndpoints(); - status_t _SetupEndpoints(); -// void ParseAudioControlInterface(usb_device device, -// size_t interface, usb_interface_info *Interface); -// void ParseAudioStreamingInterface(usb_device device, -// size_t interface, usb_interface_list *List); +// protected: + virtual status_t StartDevice() { return B_OK; } + virtual status_t StopDevice(); -protected: -virtual status_t StartDevice() { return B_OK; } -virtual status_t StopDevice(); + void TraceMultiDescription(multi_description* Description, + Vector& Channels); + void TraceListMixControls(multi_mix_control_info* Info); - void TraceMultiDescription(multi_description *Description, - Vector& Channels); - void TraceListMixControls(multi_mix_control_info *Info); // state tracking - status_t fStatus; - bool fOpen; - bool fRemoved; - vint32 fInsideNotify; - usb_device fDevice; - uint16 fUSBVersion; - uint16 fVendorID; - uint16 fProductID; -const char * fDescription; - bool fNonBlocking; + status_t fStatus; + bool fOpen; + bool fRemoved; +// int32 fInsideNotify; // TODO: move to Stream! + usb_device fDevice; + uint16 fUSBVersion; + uint16 fVendorID; + uint16 fProductID; + const char* fDescription; + bool fNonBlocking; - AudioControlInterface fAudioControl; -/* - AudioControlHeader* fAudioControlHeader; - // map to store all controls and lookup by control ID - AudioControlsMap fAudioControls; - // map to store output terminal and lookup them by source ID - AudioControlsMap fOutputTerminals; - // map to store output terminal and lookup them by control ID - AudioControlsMap fInputTerminals; -*/ - // vector of audio streams - AudioStreamsVector fStreams; + AudioControlInterface fAudioControl; + Vector fStreams; -protected: - status_t _MultiGetDescription(multi_description *Description); - status_t _MultiGetEnabledChannels(multi_channel_enable *Enable); - status_t _MultiSetEnabledChannels(multi_channel_enable *Enable); - status_t _MultiGetBuffers(multi_buffer_list* List); - status_t _MultiGetGlobalFormat(multi_format_info *Format); - status_t _MultiSetGlobalFormat(multi_format_info *Format); - status_t _MultiGetMix(multi_mix_value_info *Info); - status_t _MultiSetMix(multi_mix_value_info *Info); - status_t _MultiListMixControls(multi_mix_control_info* Info); - status_t _MultiBufferExchange(multi_buffer_info* Info); - status_t _MultiBufferForceStop(); +// protected: + status_t _MultiGetDescription(multi_description* Description); + status_t _MultiGetEnabledChannels(multi_channel_enable* Enable); + status_t _MultiSetEnabledChannels(multi_channel_enable* Enable); + status_t _MultiGetBuffers(multi_buffer_list* List); + status_t _MultiGetGlobalFormat(multi_format_info* Format); + status_t _MultiSetGlobalFormat(multi_format_info* Format); + status_t _MultiGetMix(multi_mix_value_info* Info); + status_t _MultiSetMix(multi_mix_value_info* Info); + status_t _MultiListMixControls(multi_mix_control_info* Info); + status_t _MultiBufferExchange(multi_buffer_info* Info); + status_t _MultiBufferForceStop(); - // interface and device infos -// uint16 fFrameSize; - - // pipes for notifications and data io -// usb_pipe fControlEndpoint; -// usb_pipe fInStreamEndpoint; -// usb_pipe fOutStreamEndpoint; - - // data stores for async usb transfers - uint32 fActualLengthRead; - uint32 fActualLengthWrite; - int32 fStatusRead; - int32 fStatusWrite; - sem_id fNotifyReadSem; - sem_id fNotifyWriteSem; - - uint8 * fNotifyBuffer; - uint32 fNotifyBufferLength; - - sem_id fBuffersReadySem; + sem_id fBuffersReadySem; }; diff --git a/src/add-ons/kernel/drivers/audio/usb_audio/Driver.cpp b/src/add-ons/kernel/drivers/audio/usb_audio/Driver.cpp index 326cfc8d1b..95067f6b6a 100644 --- a/src/add-ons/kernel/drivers/audio/usb_audio/Driver.cpp +++ b/src/add-ons/kernel/drivers/audio/usb_audio/Driver.cpp @@ -1,47 +1,35 @@ /* * Driver for USB Audio Device Class devices. - * Copyright (c) 2009,10,12 S.Zharski + * Copyright (c) 2009-13 S.Zharski * Distributed under the terms of the MIT license. * */ -#include -#include -#include - -#include // for mutex - #include "Driver.h" -#include "Settings.h" + +#include + #include "Device.h" -#include "USB_audio_spec.h" +#include "Settings.h" +static const char* sDeviceBaseName = "audio/hmulti/USB Audio/"; + +usb_module_info* gUSBModule = NULL; + +Device* gDevices[MAX_DEVICES]; +char* gDeviceNames[MAX_DEVICES + 1]; + +mutex gDriverLock; int32 api_version = B_CUR_DRIVER_API_VERSION; -static const char *sDeviceBaseName = "audio/hmulti/USB Audio/"; -Device *gDevices[MAX_DEVICES]; -char *gDeviceNames[MAX_DEVICES + 1]; - -usb_module_info *gUSBModule = NULL; - - -mutex gDriverLock; -// auto - release helper class -class DriverSmartLock { -public: - DriverSmartLock() { mutex_lock(&gDriverLock); } - ~DriverSmartLock() { mutex_unlock(&gDriverLock); } -}; - - status_t -usb_audio_device_added(usb_device device, void **cookie) +usb_audio_device_added(usb_device device, void** cookie) { *cookie = NULL; - DriverSmartLock driverLock; // released on exit + MutexLocker driverLock; // check if this is a replug of an existing device first for (int32 i = 0; i < MAX_DEVICES; i++) { @@ -57,10 +45,9 @@ usb_audio_device_added(usb_device device, void **cookie) } // no such device yet, create a new one - Device *audioDevice = new Device(device); - if (audioDevice == 0) { + Device* audioDevice = new Device(device); + if (audioDevice == 0) return ENODEV; - } status_t status = audioDevice->InitCheck(); if (status < B_OK) { @@ -94,11 +81,11 @@ usb_audio_device_added(usb_device device, void **cookie) status_t -usb_audio_device_removed(void *cookie) +usb_audio_device_removed(void* cookie) { - DriverSmartLock driverLock; // released on exit + MutexLocker driverLock; - Device *device = (Device *)cookie; + Device* device = (Device*)cookie; for (int32 i = 0; i < MAX_DEVICES; i++) { if (gDevices[i] == device) { if (device->IsOpen()) { @@ -128,7 +115,7 @@ status_t init_driver() { status_t status = get_module(B_USB_MODULE_NAME, - (module_info **)&gUSBModule); + (module_info**)&gUSBModule); if (status < B_OK) return status; @@ -148,7 +135,7 @@ init_driver() }; static usb_support_descriptor supportedDevices[] = { - {UAS_AUDIO, 0, 0, 0, 0 } + { UAS_AUDIO, 0, 0, 0, 0 } }; gUSBModule->register_driver(DRIVER_NAME, supportedDevices, 0, NULL); @@ -183,9 +170,9 @@ uninit_driver() static status_t -usb_audio_open(const char *name, uint32 flags, void **cookie) +usb_audio_open(const char* name, uint32 flags, void** cookie) { - DriverSmartLock driverLock; // released on exit + MutexLocker driverLock; *cookie = NULL; status_t status = ENODEV; @@ -200,44 +187,44 @@ usb_audio_open(const char *name, uint32 flags, void **cookie) static status_t -usb_audio_read(void *cookie, off_t position, void *buffer, size_t *numBytes) +usb_audio_read(void* cookie, off_t position, void* buffer, size_t* numBytes) { - Device *device = (Device *)cookie; - return device->Read((uint8 *)buffer, numBytes); + Device* device = (Device*)cookie; + return device->Read((uint8*)buffer, numBytes); } static status_t -usb_audio_write(void *cookie, off_t position, const void *buffer, - size_t *numBytes) +usb_audio_write(void* cookie, off_t position, const void* buffer, + size_t* numBytes) { - Device *device = (Device *)cookie; - return device->Write((const uint8 *)buffer, numBytes); + Device* device = (Device*)cookie; + return device->Write((const uint8*)buffer, numBytes); } static status_t -usb_audio_control(void *cookie, uint32 op, void *buffer, size_t length) +usb_audio_control(void* cookie, uint32 op, void* buffer, size_t length) { - Device *device = (Device *)cookie; + Device* device = (Device*)cookie; return device->Control(op, buffer, length); } static status_t -usb_audio_close(void *cookie) +usb_audio_close(void* cookie) { - Device *device = (Device *)cookie; + Device* device = (Device*)cookie; return device->Close(); } static status_t -usb_audio_free(void *cookie) +usb_audio_free(void* cookie) { - Device *device = (Device *)cookie; + Device* device = (Device*)cookie; - DriverSmartLock driverLock; // released on exit + MutexLocker driverLock; status_t status = device->Free(); for (int32 i = 0; i < MAX_DEVICES; i++) { @@ -255,7 +242,7 @@ usb_audio_free(void *cookie) } -const char ** +const char** publish_devices() { for (int32 i = 0; gDeviceNames[i]; i++) { @@ -263,14 +250,14 @@ publish_devices() gDeviceNames[i] = NULL; } - DriverSmartLock driverLock; // released on exit + MutexLocker driverLock; int32 deviceCount = 0; for (int32 i = 0; i < MAX_DEVICES; i++) { if (gDevices[i] == NULL) continue; - gDeviceNames[deviceCount] = (char *)malloc(strlen(sDeviceBaseName) + 4); + gDeviceNames[deviceCount] = (char*)malloc(strlen(sDeviceBaseName) + 4); if (gDeviceNames[deviceCount]) { sprintf(gDeviceNames[deviceCount], "%s%ld", sDeviceBaseName, i); TRACE("publishing %s\n", gDeviceNames[deviceCount]); @@ -280,12 +267,12 @@ publish_devices() } gDeviceNames[deviceCount] = NULL; - return (const char **)&gDeviceNames[0]; + return (const char**)&gDeviceNames[0]; } -device_hooks * -find_device(const char *name) +device_hooks* +find_device(const char* name) { static device_hooks deviceHooks = { usb_audio_open, @@ -294,8 +281,8 @@ find_device(const char *name) usb_audio_control, usb_audio_read, usb_audio_write, - NULL, /* select */ - NULL /* deselect */ + NULL, // select + NULL // deselect }; return &deviceHooks; diff --git a/src/add-ons/kernel/drivers/audio/usb_audio/Driver.h b/src/add-ons/kernel/drivers/audio/usb_audio/Driver.h index 07acd4d0e4..91acdea5b6 100644 --- a/src/add-ons/kernel/drivers/audio/usb_audio/Driver.h +++ b/src/add-ons/kernel/drivers/audio/usb_audio/Driver.h @@ -1,6 +1,6 @@ /* * Driver for USB Audio Device Class devices. - * Copyright (c) 2009,10,12 S.Zharski + * Copyright (c) 2009-13 S.Zharski * Distributed under the terms of the MIT license. * */ @@ -8,22 +8,20 @@ #define _USB_AUDIO_DRIVER_H_ -#include -#include #include #include -#include #define DRIVER_NAME "usb_audio" #define MAX_DEVICES 8 -const char* const kVersion = "ver.0.0.4"; +const char* const kVersion = "ver.0.0.5"; +// initial buffer size in samples const uint32 kSamplesBufferSize = 1024; +// [sub]buffers count const uint32 kSamplesBufferCount = 2; - // calculate count of array members #ifdef _countof #warning "countof(...) WAS ALREADY DEFINED!!! Remove local definition!" @@ -32,21 +30,16 @@ const uint32 kSamplesBufferCount = 2; #define _countof(array)(sizeof(array) / sizeof(array[0])) -extern usb_module_info *gUSBModule; +extern usb_module_info* gUSBModule; +extern "C" status_t usb_audio_device_added(usb_device device, void** cookie); +extern "C" status_t usb_audio_device_removed(void* cookie); -extern "C" { +extern "C" status_t init_hardware(); +extern "C" void uninit_driver(); - status_t usb_audio_device_added(usb_device device, void **cookie); - status_t usb_audio_device_removed(void *cookie); - - status_t init_hardware(); - void uninit_driver(); - - const char **publish_devices(); - device_hooks *find_device(const char *name); - -} +extern "C" const char** publish_devices(); +extern "C" device_hooks *find_device(const char* name); #endif // _USB_AUDIO_DRIVER_H_ diff --git a/src/add-ons/kernel/drivers/audio/usb_audio/Jamfile b/src/add-ons/kernel/drivers/audio/usb_audio/Jamfile index 0ca7052f1b..fca7d129a5 100644 --- a/src/add-ons/kernel/drivers/audio/usb_audio/Jamfile +++ b/src/add-ons/kernel/drivers/audio/usb_audio/Jamfile @@ -2,11 +2,10 @@ SubDir HAIKU_TOP src add-ons kernel drivers audio usb_audio ; SetSubDirSupportedPlatformsBeOSCompatible ; -UsePrivateHeaders kernel media ; - UsePrivateHeaders kernel net ; - +UsePrivateKernelHeaders ; UsePrivateHeaders [ FDirName kernel util ] ; +UsePrivateHeaders kernel media ; KernelAddon usb_audio : Driver.cpp diff --git a/src/add-ons/kernel/drivers/audio/usb_audio/Settings.cpp b/src/add-ons/kernel/drivers/audio/usb_audio/Settings.cpp index 7b656ce6e0..1ebdf1bb01 100644 --- a/src/add-ons/kernel/drivers/audio/usb_audio/Settings.cpp +++ b/src/add-ons/kernel/drivers/audio/usb_audio/Settings.cpp @@ -1,22 +1,28 @@ /* * Driver for USB Audio Device Class devices. - * Copyright (c) 2009,10,12 S.Zharski + * Copyright (c) 2009-13 S.Zharski * Distributed under the terms of the MIT license. * */ -#include // for mutex -#include // for file operation -#include // for file operation -#include // for file operation #include "Settings.h" +#include +#include +#include + +#include +#include + +#include "Driver.h" + + bool gTraceOn = false; bool gTruncateLogFile = false; bool gAddTimeStamp = true; bool gTraceFlow = false; -static char *gLogFilePath = NULL; +static char* gLogFilePath = NULL; mutex gLogLock; static @@ -36,7 +42,7 @@ void create_log() void load_settings() { - void *handle = load_driver_settings(DRIVER_NAME); + void* handle = load_driver_settings(DRIVER_NAME); if (handle == 0) return; @@ -47,11 +53,10 @@ void load_settings() gTruncateLogFile, true); gAddTimeStamp = get_driver_boolean_parameter(handle, "add_timestamp", gAddTimeStamp, true); - const char * logFilePath = get_driver_parameter(handle, "logfile", + const char* logFilePath = get_driver_parameter(handle, "logfile", NULL, "/var/log/"DRIVER_NAME".log"); - if (logFilePath != NULL) { + if (logFilePath != NULL) gLogFilePath = strdup(logFilePath); - } unload_driver_settings(handle); @@ -68,16 +73,15 @@ void release_settings() } -void usb_audio_trace(bool force, const char* func, const char *fmt, ...) +void usb_audio_trace(bool force, const char* func, const char* fmt, ...) { - if (!(force || gTraceOn)) { + if (!(force || gTraceOn)) return; - } va_list arg_list; - static const char *prefix = DRIVER_NAME":"; + static const char* prefix = DRIVER_NAME":"; static char buffer[1024]; - char *buf_ptr = buffer; + char* buf_ptr = buffer; if (gLogFilePath == NULL) { strlcpy(buffer, prefix, sizeof(buffer)); buf_ptr += strlen(prefix); diff --git a/src/add-ons/kernel/drivers/audio/usb_audio/Settings.h b/src/add-ons/kernel/drivers/audio/usb_audio/Settings.h index 692fa4d0af..854608316d 100644 --- a/src/add-ons/kernel/drivers/audio/usb_audio/Settings.h +++ b/src/add-ons/kernel/drivers/audio/usb_audio/Settings.h @@ -1,6 +1,6 @@ /* * Driver for USB Audio Device Class devices. - * Copyright (c) 2009,10,12 S.Zharski + * Copyright (c) 2009-13 S.Zharski * Distributed under the terms of the MIT license. * */ @@ -8,14 +8,10 @@ #define _USB_AUDIO_SETTINGS_H_ -#include - -#include "Driver.h" - void load_settings(); void release_settings(); -void usb_audio_trace(bool force, const char *func, const char *fmt, ...); +void usb_audio_trace(bool force, const char* func, const char* fmt, ...); #ifdef TRACE #undef TRACE @@ -30,5 +26,5 @@ extern bool gTraceFlow; #define TRACE_RET(result) usb_audio_trace(false, __func__, \ "Returns:%#010x\n", result); -#endif /*_USB_AUDIO_SETTINGS_H_*/ +#endif // _USB_AUDIO_SETTINGS_H_ diff --git a/src/add-ons/kernel/drivers/audio/usb_audio/Stream.cpp b/src/add-ons/kernel/drivers/audio/usb_audio/Stream.cpp index 6bf20f03a1..9c813861d6 100644 --- a/src/add-ons/kernel/drivers/audio/usb_audio/Stream.cpp +++ b/src/add-ons/kernel/drivers/audio/usb_audio/Stream.cpp @@ -1,36 +1,36 @@ /* * Driver for USB Audio Device Class devices. - * Copyright (c) 2009,10,12 S.Zharski + * Copyright (c) 2009-13 S.Zharski * Distributed under the terms of the MIT license. * */ #include "Stream.h" + + #include "Device.h" #include "Driver.h" #include "Settings.h" -Stream::Stream(Device *device, size_t interface, usb_interface_list *List - /*, bool isInput, uint32 HWChannel*/) - : - AudioStreamingInterface(&device->AudioControl(), interface, List), - fDevice(device), - fStatus(B_NO_INIT), - fStreamEndpoint(0), - fIsRunning(false), - fArea(-1), - fAreaSize(0), - fDescriptors(NULL), - fDescriptorsCount(0), - fCurrentBuffer(0), - fStartingFrame(0), - fSamplesCount(0), - fPacketSize(0), - fProcessedBuffers(0) +Stream::Stream(Device* device, size_t interface, usb_interface_list* List) + : + AudioStreamingInterface(&device->AudioControl(), interface, List), + fDevice(device), + fStatus(B_NO_INIT), + fStreamEndpoint(0), + fIsRunning(false), + fArea(-1), + fAreaSize(0), + fDescriptors(NULL), + fDescriptorsCount(0), + fCurrentBuffer(0), + fStartingFrame(0), + fSamplesCount(0), + fPacketSize(0), + fProcessedBuffers(0) { - memset(&fFormat, 0, sizeof(_multi_format)); } @@ -58,7 +58,7 @@ Stream::_ChooseAlternate() if (fAlternates[i]->Format()->fFormatType != UAF_FORMAT_TYPE_I) { TRACE("Ignore alternate %d - format type %#02x is not supported.\n", - i, fAlternates[i]->Format()->fFormatType); + i, fAlternates[i]->Format()->fFormatType); continue; } @@ -71,16 +71,16 @@ Stream::_ChooseAlternate() break; default: TRACE("Ignore alternate %d - format %#04x is not supported.\n", - i, fAlternates[i]->Interface()->fFormatTag); + i, fAlternates[i]->Interface()->fFormatTag); continue; } TypeIFormatDescriptor* format - = static_cast(fAlternates[i]->Format()); + = static_cast(fAlternates[i]->Format()); if (format->fNumChannels > 2) { TRACE("Ignore alternate %d - channel count %d " - "is not supported.\n", i, format->fNumChannels); + "is not supported.\n", i, format->fNumChannels); continue; } @@ -88,7 +88,7 @@ Stream::_ChooseAlternate() switch(format->fBitResolution) { default: TRACE("Ignore alternate %d - bit resolution %d " - "is not supported.\n", i, format->fBitResolution); + "is not supported.\n", i, format->fBitResolution); continue; case 8: case 16: case 18: case 20: case 24: case 32: break; @@ -107,10 +107,11 @@ Stream::_ChooseAlternate() return B_NO_INIT; } - const ASEndpointDescriptor* endpoint = fAlternates[ - fActiveAlternate]->Endpoint(); + const ASEndpointDescriptor* endpoint + = fAlternates[fActiveAlternate]->Endpoint(); fIsInput = (endpoint->fEndpointAddress & USB_ENDPOINT_ADDR_DIR_IN) - == USB_ENDPOINT_ADDR_DIR_IN; + == USB_ENDPOINT_ADDR_DIR_IN; + TRACE("Alternate %d EP:%x selected for %s!\n", fActiveAlternate, endpoint->fEndpointAddress, fIsInput ? "recording" : "playback"); @@ -158,8 +159,8 @@ Stream::_SetupBuffers() B_READ_AREA | B_WRITE_AREA); if (fArea < 0) { - TRACE_ALWAYS("Error of creating %#x - bytes size buffer area:%#010x\n", - fAreaSize, fArea); + TRACE_ALWAYS("Error of creating %#x - " + "bytes size buffer area:%#010x\n", fAreaSize, fArea); fStatus = fArea; return fStatus; } @@ -197,7 +198,7 @@ Stream::_SetupBuffers() status_t Stream::OnSetConfiguration(usb_device device, - const usb_configuration_info *config) + const usb_configuration_info* config) { if (config == NULL) { TRACE_ALWAYS("NULL configuration. Not set.\n"); @@ -205,7 +206,7 @@ Stream::OnSetConfiguration(usb_device device, } usb_interface_info* interface - = &config->interface[fInterface].alt[fActiveAlternate]; + = &config->interface[fInterface].alt[fActiveAlternate]; if (interface == NULL) { TRACE_ALWAYS("NULL interface. Not set.\n"); return B_ERROR; @@ -220,29 +221,13 @@ Stream::OnSetConfiguration(usb_device device, if (address == interface->endpoint[i].descr->endpoint_address) { fStreamEndpoint = interface->endpoint[i].handle; TRACE("%s Stream Endpoint [address %#04x] handle is: %#010x.\n", - fIsInput ? "Input" : "Output", address, fStreamEndpoint); -/* - size_t actualLength = 0; - uint32 speed = 48000; - uint8 data[3]; - data[0] = 0xFF & speed; - data[1] = (uint8) 0xFF & speed >> 8; - data[2] = (uint8) 0xFF & speed >> 16; - - status_t status = gUSBModule->send_request(device, - USB_REQTYPE_CLASS | USB_REQTYPE_ENDPOINT_OUT, - UAS_SET_CUR, UAS_SAMPLING_FREQ_CONTROL << 8, - address, 3, data, &actualLength); - - TRACE_ALWAYS("set_speed for ep %#x %d: %x\n", - address, actualLength, status); -*/ + fIsInput ? "Input" : "Output", address, fStreamEndpoint); return B_OK; } } TRACE("%s Stream Endpoint [address %#04x] was not found.\n", - fIsInput ? "Input" : "Output", address); + fIsInput ? "Input" : "Output", address); return B_ERROR; } @@ -278,9 +263,8 @@ Stream::Stop() status_t Stream::_QueueNextTransfer(size_t queuedBuffer, bool start) { - TypeIFormatDescriptor* format - = static_cast(fAlternates[ - fActiveAlternate]->Format()); + TypeIFormatDescriptor* format = static_cast( + fAlternates[fActiveAlternate]->Format()); size_t bufferSize = format->fNumChannels * format->fSubframeSize; bufferSize *= fSamplesCount / kSamplesBufferCount; @@ -290,34 +274,14 @@ Stream::_QueueNextTransfer(size_t queuedBuffer, bool start) size_t packetsCount = fDescriptorsCount / kSamplesBufferCount; TRACE("buffers:%#010x[%#x]\ndescrs:%#010x[%#x]\n", - buffers + bufferSize * queuedBuffer, bufferSize, - fDescriptors + queuedBuffer * packetsCount, packetsCount); -#if 0 -{ - static int16 sin[24] = { 0, 4277, 8481, 12540, 16384, 19948, 23170, 25996, - 28378, 30273, 31651, 32487, 32767, 32487, 31651, 30273, 28378, 25996, - 23170, 19948, 16384, 12540, 8481, 4277 }; - static uint16 sample = 0; - static bool sign = true; - - uint16* b = (uint16*)(buffers + bufferSize * queuedBuffer); - size_t length = bufferSize; - for (size_t u = 0; u < length / 2; u += 2) { - b[u] = b[u + 1] = sign ? sin[sample] : -sin[sample]; - sample ++; - if (sample == 24) { - sample = 0; - sign = !sign; - } - } -} -#endif + buffers + bufferSize * queuedBuffer, bufferSize, + fDescriptors + queuedBuffer * packetsCount, packetsCount); status_t status = gUSBModule->queue_isochronous(fStreamEndpoint, - buffers + bufferSize * queuedBuffer, bufferSize, - fDescriptors + queuedBuffer * packetsCount, packetsCount, - &fStartingFrame, start ? USB_ISO_ASAP : 0, - Stream::_TransferCallback, this); + buffers + bufferSize * queuedBuffer, bufferSize, + fDescriptors + queuedBuffer * packetsCount, packetsCount, + &fStartingFrame, start ? USB_ISO_ASAP : 0, + Stream::_TransferCallback, this); TRACE("frame:%#010x\n", fStartingFrame); return status; // B_OK; @@ -325,16 +289,16 @@ Stream::_QueueNextTransfer(size_t queuedBuffer, bool start) void -Stream::_TransferCallback(void *cookie, int32 status, void *data, +Stream::_TransferCallback(void* cookie, int32 status, void* data, uint32 actualLength) { if (status == B_CANCELED) { TRACE_ALWAYS("Cancelled: c:%p st:%#010x, data:%#010x, len:%d\n", - cookie, status, data, actualLength); + cookie, status, data, actualLength); return; } - Stream *stream = (Stream *)cookie; + Stream* stream = (Stream*)cookie; stream->fCurrentBuffer = (stream->fCurrentBuffer + 1) % kSamplesBufferCount; @@ -342,9 +306,8 @@ Stream::_TransferCallback(void *cookie, int32 status, void *data, /*status_t result =*/ stream->_QueueNextTransfer(stream->fCurrentBuffer, false); - if (atomic_add(&stream->fProcessedBuffers, 1) > (int32)kSamplesBufferCount) { + if (atomic_add(&stream->fProcessedBuffers, 1) > (int32)kSamplesBufferCount) TRACE_ALWAYS("Processed buffers overflow:%d\n", stream->fProcessedBuffers); - } release_sem_etc(stream->fDevice->fBuffersReadySem, 1, B_DO_NOT_RESCHEDULE); @@ -359,21 +322,19 @@ Stream::_DumpDescriptors() //size_t packetsCount = fDescriptorsCount / kSamplesBufferCount; size_t from = /*fCurrentBuffer > 0 ? packetsCount :*/ 0 ; size_t to = /*fCurrentBuffer > 0 ?*/ fDescriptorsCount /*: packetsCount*/ ; - for (size_t i = from; i < to; i++) { + for (size_t i = from; i < to; i++) TRACE("%d:req_len:%d; act_len:%d; stat:%#010x\n", i, fDescriptors[i].request_length, fDescriptors[i].actual_length, fDescriptors[i].status); - } } status_t -Stream::GetEnabledChannels(uint32& offset, multi_channel_enable *Enable) +Stream::GetEnabledChannels(uint32& offset, multi_channel_enable* Enable) { AudioChannelCluster* cluster = ChannelCluster(); - if (cluster == 0) { + if (cluster == 0) return B_ERROR; - } for (size_t i = 0; i < cluster->ChannelsCount(); i++) { B_SET_CHANNEL(Enable->enable_bits, offset++, true); @@ -385,24 +346,22 @@ Stream::GetEnabledChannels(uint32& offset, multi_channel_enable *Enable) status_t -Stream::SetEnabledChannels(uint32& offset, multi_channel_enable *Enable) +Stream::SetEnabledChannels(uint32& offset, multi_channel_enable* Enable) { AudioChannelCluster* cluster = ChannelCluster(); - if (cluster == 0) { + if (cluster == 0) return B_ERROR; - } - for (size_t i = 0; i < cluster->ChannelsCount(); i++) { + for (size_t i = 0; i < cluster->ChannelsCount(); i++) TRACE("%s channel %d.\n", (B_TEST_CHANNEL(Enable->enable_bits, offset++) - ? "Enable" : "Disable"), offset + 1); - } + ? "Enable" : "Disable"), offset + 1); return B_OK; } status_t -Stream::GetGlobalFormat(multi_format_info *Format) +Stream::GetGlobalFormat(multi_format_info* Format) { _multi_format* format = fIsInput ? &Format->input : &Format->output; format->cvsr = fAlternates[fActiveAlternate]->GetSamplingRate(); @@ -416,12 +375,12 @@ Stream::GetGlobalFormat(multi_format_info *Format) status_t -Stream::SetGlobalFormat(multi_format_info *Format) +Stream::SetGlobalFormat(multi_format_info* Format) { _multi_format* format = fIsInput ? &Format->input : &Format->output; AudioStreamAlternate* alternate = fAlternates[fActiveAlternate]; if (format->rate == alternate->GetSamplingRateId(0) - && format->format == alternate->GetFormatId()) { + && format->format == alternate->GetFormatId()) { TRACE("No changes required\n"); return B_OK; } @@ -453,13 +412,13 @@ Stream::SetGlobalFormat(multi_format_info *Format) uint8 address = fAlternates[fActiveAlternate]->Endpoint()->fEndpointAddress; status = gUSBModule->send_request(fDevice->fDevice, - USB_REQTYPE_CLASS | USB_REQTYPE_ENDPOINT_OUT, - UAS_SET_CUR, UAS_SAMPLING_FREQ_CONTROL << 8, - address, 3, data, &actualLength); + USB_REQTYPE_CLASS | USB_REQTYPE_ENDPOINT_OUT, + UAS_SET_CUR, UAS_SAMPLING_FREQ_CONTROL << 8, + address, 3, data, &actualLength); TRACE_ALWAYS("set_speed %02x%02x%02x for ep %#x %d: %x\n", - data[0], data[1], data[2], - address, actualLength, status); + data[0], data[1], data[2], + address, actualLength, status); return status; } @@ -494,9 +453,8 @@ Stream::GetBuffers(multi_buffer_list* List) List->return_playback_buffer_size, List->return_playback_buffers); } - TypeIFormatDescriptor* format - = static_cast( - fAlternates[fActiveAlternate]->Format()); + TypeIFormatDescriptor* format = static_cast( + fAlternates[fActiveAlternate]->Format()); // const ASEndpointDescriptor* endpoint // = fAlternates[fActiveAlternate]->Endpoint(); @@ -505,18 +463,17 @@ Stream::GetBuffers(multi_buffer_list* List) TRACE("%s buffer #%d:\n", fIsInput ? "input" : "output", buffer + 1); for (size_t channel = startChannel; - channel < format->fNumChannels; channel++) - { + channel < format->fNumChannels; channel++) { // init stride to the same for all buffers uint32 stride = format->fSubframeSize * format->fNumChannels; Buffers[buffer][channel].stride = stride; // init to buffers area begin Buffers[buffer][channel].base - = (char*)(fDescriptors + fDescriptorsCount); + = (char*)(fDescriptors + fDescriptorsCount); // shift for whole buffer if required size_t bufferSize = fPacketSize/*endpoint->fMaxPacketSize*/ - * (fDescriptorsCount / kSamplesBufferCount); + * (fDescriptorsCount / kSamplesBufferCount); Buffers[buffer][channel].base += buffer * bufferSize; // shift for channel if required Buffers[buffer][channel].base += channel * format->fSubframeSize; @@ -528,11 +485,12 @@ Stream::GetBuffers(multi_buffer_list* List) if (fIsInput) { List->return_record_channels += format->fNumChannels; - TRACE("return_record_channels:%#010x\n", List->return_record_channels); + TRACE("return_record_channels:%#010x\n", + List->return_record_channels); } else { List->return_playback_channels += format->fNumChannels; TRACE("return_playback_channels:%#010x\n", - List->return_playback_channels); + List->return_playback_channels); } return B_OK; @@ -563,18 +521,3 @@ Stream::ExchangeBuffer(multi_buffer_info* Info) return true; } - -/* -ASInterfaceDescriptor* -Stream::ASInterface() -{ - return fAlternates[fActiveAlternate]->Interface(); -} - - -_ASFormatDescriptor* -Stream::ASFormat() -{ - return fAlternates[fActiveAlternate]->Format(); -}*/ - diff --git a/src/add-ons/kernel/drivers/audio/usb_audio/Stream.h b/src/add-ons/kernel/drivers/audio/usb_audio/Stream.h index 927e08b269..fb0fe65373 100644 --- a/src/add-ons/kernel/drivers/audio/usb_audio/Stream.h +++ b/src/add-ons/kernel/drivers/audio/usb_audio/Stream.h @@ -1,95 +1,72 @@ /* * Driver for USB Audio Device Class devices. - * Copyright (c) 2009,10,12 S.Zharski + * Copyright (c) 2009-13 S.Zharski * Distributed under the terms of the MIT license. * */ -#ifndef _STREAM_H_ -#define _STREAM_H_ +#ifndef _USB_AUDIO_STREAM_H_ +#define _USB_AUDIO_STREAM_H_ -#include - #include "AudioStreamingInterface.h" + class Device; -// typedef Vector StreamAlternatesVector; -// typedef Vector::Iterator StreamAlternatesIterator; - class Stream : public AudioStreamingInterface { - friend class Device; + friend class Device; public: Stream(Device* device, size_t interface, - usb_interface_list *List - /*, bool isInput, uint32 HWChannel*/); + usb_interface_list* List); ~Stream(); - status_t Init(); - status_t InitCheck() { return fStatus; } - status_t Start(); - status_t Stop(); - bool IsRunning() { return fIsRunning; } + status_t Init(); + status_t InitCheck() { return fStatus; } - status_t GetBuffers(multi_buffer_list* List); + status_t Start(); + status_t Stop(); + bool IsRunning() { return fIsRunning; } - status_t OnSetConfiguration(usb_device device, - const usb_configuration_info *config); + status_t GetBuffers(multi_buffer_list* List); - bool ExchangeBuffer(multi_buffer_info* Info); -/* - int32 InterruptHandler(uint32 SignaledChannelsMask); -*/ -// ASInterfaceDescriptor* ASInterface(); -// _ASFormatDescriptor* ASFormat(); - status_t GetEnabledChannels(uint32& offset, - multi_channel_enable *Enable); - status_t SetEnabledChannels(uint32& offset, - multi_channel_enable *Enable); - status_t GetGlobalFormat(multi_format_info *Format); - status_t SetGlobalFormat(multi_format_info *Format); + status_t OnSetConfiguration(usb_device device, + const usb_configuration_info* config); + bool ExchangeBuffer(multi_buffer_info* Info); + status_t GetEnabledChannels(uint32& offset, + multi_channel_enable* Enable); + status_t SetEnabledChannels(uint32& offset, + multi_channel_enable* Enable); + status_t GetGlobalFormat(multi_format_info* Format); + status_t SetGlobalFormat(multi_format_info* Format); protected: - Device* fDevice; - status_t fStatus; + Device* fDevice; + status_t fStatus; - // alternates of the streams -// StreamAlternatesVector fAlternates; -// size_t fActiveAlternate; - - uint8 fTerminalID; - usb_pipe fStreamEndpoint; - bool fIsRunning; - area_id fArea; - size_t fAreaSize; - usb_iso_packet_descriptor* fDescriptors; - size_t fDescriptorsCount; - size_t fCurrentBuffer; - uint32 fStartingFrame; - size_t fSamplesCount; - size_t fPacketSize; - int32 fProcessedBuffers; - _multi_format fFormat; + uint8 fTerminalID; + usb_pipe fStreamEndpoint; + bool fIsRunning; + area_id fArea; + size_t fAreaSize; + usb_iso_packet_descriptor* fDescriptors; + size_t fDescriptorsCount; + size_t fCurrentBuffer; + uint32 fStartingFrame; + size_t fSamplesCount; + size_t fPacketSize; + int32 fProcessedBuffers; private: - status_t _ChooseAlternate(); - status_t _SetupBuffers(); - status_t _QueueNextTransfer(size_t buffer, bool start); -static void _TransferCallback(void *cookie, int32 status, - void *data, uint32 actualLength); - void _DumpDescriptors(); + status_t _ChooseAlternate(); + status_t _SetupBuffers(); + status_t _QueueNextTransfer(size_t buffer, bool start); + static void _TransferCallback(void* cookie, int32 status, + void* data, uint32 actualLength); + void _DumpDescriptors(); }; -/* -class RecordStream : public Stream { -public: - RecordStream(Device* device, uint32 HWChannel); - ~RecordStream(); - status_t Start(); -}; -*/ -#endif // _STREAM_H_ +#endif // _USB_AUDIO_STREAM_H_ diff --git a/src/add-ons/kernel/drivers/audio/usb_audio/USB_audio_spec.h b/src/add-ons/kernel/drivers/audio/usb_audio/USB_audio_spec.h index 47c3876fbf..6a328c8433 100644 --- a/src/add-ons/kernel/drivers/audio/usb_audio/USB_audio_spec.h +++ b/src/add-ons/kernel/drivers/audio/usb_audio/USB_audio_spec.h @@ -7,10 +7,11 @@ * And the USB Device Class Definition for Audio Formats Release 1.0 * (March 18, 1998) */ - #ifndef __USB_AUDIO_SPEC_H__ #define __USB_AUDIO_SPEC_H__ +#include + #ifdef __cplusplus extern "C" { #endif diff --git a/src/add-ons/kernel/drivers/audio/usb_audio/makefile b/src/add-ons/kernel/drivers/audio/usb_audio/makefile deleted file mode 100644 index a47a5d2554..0000000000 --- a/src/add-ons/kernel/drivers/audio/usb_audio/makefile +++ /dev/null @@ -1,127 +0,0 @@ -## BeOS Generic Makefile v2.2 ## - -## Fill in this file to specify the project being created, and the referenced -## makefile-engine will do all of the hard work for you. This handles both -## Intel and PowerPC builds of the BeOS. - -## Application Specific Settings --------------------------------------------- - -# specify the name of the binary -NAME=usb_audio - -# specify the type of binary -# APP: Application -# SHARED: Shared library or add-on -# STATIC: Static library archive -# DRIVER: Kernel Driver -TYPE=DRIVER - -# add support for new Pe and Eddie features -# to fill in generic makefile - -#%{ -# @src->@ - -# specify the source files to use -# full paths or paths relative to the makefile can be included -# all files, regardless of directory, will have their object -# files created in the common object directory. -# Note that this means this makefile will not work correctly -# if two source files with the same name (source.c or source.cpp) -# are included from different directories. Also note that spaces -# in folder names do not work well with this makefile. -SRCS=Driver.cpp\ - Device.cpp\ - AudioControlInterface.cpp\ - AudioStreamingInterface.cpp\ - Stream.cpp\ - Settings.cpp - -# specify the resource files to use -# full path or a relative path to the resource file can be used. -RSRCS= - -# @<-src@ -#%} - -# end support for Pe and Eddie - -# specify additional libraries to link against -# there are two acceptable forms of library specifications -# - if your library follows the naming pattern of: -# libXXX.so or libXXX.a you can simply specify XXX -# library: libbe.so entry: be -# -# - if your library does not follow the standard library -# naming scheme you need to specify the path to the library -# and it's name -# library: my_lib.a entry: my_lib.a or path/my_lib.a -LIBS= - -# specify additional paths to directories following the standard -# libXXX.so or libXXX.a naming scheme. You can specify full paths -# or paths relative to the makefile. The paths included may not -# be recursive, so include all of the paths where libraries can -# be found. Directories where source files are found are -# automatically included. -LIBPATHS= - -# additional paths to look for system headers -# thes use the form: #include
-# source file directories are NOT auto-included here -SYSTEM_INCLUDE_PATHS=../../../../../../headers/private/kernel \ - ../../../../../../headers/private/kernel/util \ - ../../../../../../headers/private/media - -# additional paths to look for local headers -# thes use the form: #include "header" -# source file directories are automatically included -LOCAL_INCLUDE_PATHS=../../../../../../build/config_headers - -# specify the level of optimization that you desire -# NONE, SOME, FULL -OPTIMIZE= - -# specify any preprocessor symbols to be defined. The symbols will not -# have their values set automatically; you must supply the value (if any) -# to use. For example, setting DEFINES to "DEBUG=1" will cause the -# compiler option "-DDEBUG=1" to be used. Setting DEFINES to "DEBUG" -# would pass "-DDEBUG" on the compiler's command line. -DEFINES= - -# specify special warning levels -# if unspecified default warnings will be used -# NONE = supress all warnings -# ALL = enable all warnings -WARNINGS=ALL - -# specify whether image symbols will be created -# so that stack crawls in the debugger are meaningful -# if TRUE symbols will be created -SYMBOLS= - -# specify debug settings -# if TRUE will allow application to be run from a source-level -# debugger. Note that this will disable all optimzation. -DEBUGGER= - -# specify additional compiler flags for all files -COMPILER_FLAGS= - -# specify additional linker flags -LINKER_FLAGS= - -# specify the version of this particular item -# (for example, -app 3 4 0 d 0 -short 340 -long "340 "`echo -n -e '\302\251'`"1999 GNU GPL") -# This may also be specified in a resource. -APP_VERSION= - -# (for TYPE == DRIVER only) Specify desired location of driver in the /dev -# hierarchy. Used by the driverinstall rule. E.g., DRIVER_PATH = video/usb will -# instruct the driverinstall rule to place a symlink to your driver's binary in -# ~/add-ons/kernel/drivers/dev/video/usb, so that your driver will appear at -# /dev/video/usb when loaded. Default is "misc". -DRIVER_PATH=audio/hmulti - -## include the makefile-engine -include $(BUILDHOME)/etc/makefile-engine