From a8066fe34aa482e529b7afcedec1456c8fd7bd02 Mon Sep 17 00:00:00 2001 From: Siarzhuk Zharski Date: Fri, 28 Jun 2013 15:19:11 +0200 Subject: [PATCH] USB audio: dev.entry number should be 1-based, etc * USB audio device entry number made 1-based instead of 0. According to Haiku MultiAudio specs audio device entries should be 1-based but 0-based; * cleanup and refactoring. No functional changes; * recording stream activated; * fix input channels description report and codestyle issues. --- .../audio/usb_audio/AudioControlInterface.cpp | 337 +++++------------- .../audio/usb_audio/AudioControlInterface.h | 1 + .../kernel/drivers/audio/usb_audio/Device.cpp | 57 ++- .../kernel/drivers/audio/usb_audio/Driver.cpp | 4 +- .../drivers/audio/usb_audio/Settings.cpp | 6 - .../kernel/drivers/audio/usb_audio/Settings.h | 15 +- .../kernel/drivers/audio/usb_audio/Stream.cpp | 15 +- 7 files changed, 159 insertions(+), 276 deletions(-) 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 bbbe6a2885..e0c2b82bcc 100644 --- a/src/add-ons/kernel/drivers/audio/usb_audio/AudioControlInterface.cpp +++ b/src/add-ons/kernel/drivers/audio/usb_audio/AudioControlInterface.cpp @@ -13,241 +13,6 @@ #include "Driver.h" #include "Settings.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) -{ - static struct _pair { - uint16 type; - const char* description; - } termInfoPairs[] = { - // USB Terminal Types - { USB_AUDIO_UNDEFINED_USB_IO, "USB I/O" }, - { USB_AUDIO_STREAMING_USB_IO, "USB Streaming I/O" }, - { USB_AUDIO_VENDOR_USB_IO, "Vendor USB I/O" }, - // Input Terminal Types - { USB_AUDIO_UNDEFINED_IN, "Undefined Input" }, - { USB_AUDIO_MICROPHONE_IN, "Microphone" }, - { USB_AUDIO_DESKTOPMIC_IN, "Desktop Microphone" }, - { USB_AUDIO_PERSONALMIC_IN, "Personal Microphone" }, - { USB_AUDIO_OMNI_MIC_IN, "Omni-directional Mic" }, - { USB_AUDIO_MICS_ARRAY_IN, "Microphone Array" }, - { USB_AUDIO_PROC_MICS_ARRAY_IN, "Processing Mic Array" }, - // Output Terminal Types - { USB_AUDIO_UNDEFINED_OUT, "Undefined Output" }, - { USB_AUDIO_SPEAKER_OUT, "Speaker" }, - { USB_AUDIO_HEAD_PHONES_OUT, "Headphones" }, - { USB_AUDIO_HMD_AUDIO_OUT, "Head Mounted Disp.Audio" }, - { USB_AUDIO_DESKTOP_SPEAKER, "Desktop Speaker" }, - { USB_AUDIO_ROOM_SPEAKER, "Room Speaker" }, - { USB_AUDIO_COMM_SPEAKER, "Communication Speaker" }, - { USB_AUDIO_LFE_SPEAKER, "LFE Speaker" }, - // Bi-directional Terminal Types - { USB_AUDIO_UNDEFINED_IO, "Undefined I/O" }, - { USB_AUDIO_HANDSET_IO, "Handset" }, - { USB_AUDIO_HEADSET_IO, "Headset" }, - { USB_AUDIO_SPEAKER_PHONE_IO, "Speakerphone" }, - { USB_AUDIO_SPEAKER_PHONEES_IO, "Echo-supp Speakerphone" }, - { USB_AUDIO_SPEAKER_PHONEEC_IO, "Echo-cancel Speakerphone" }, - // Telephony Terminal Types - { USB_AUDIO_UNDEF_TELEPHONY_IO, "Undefined Telephony" }, - { USB_AUDIO_PHONE_LINE_IO, "Phone Line" }, - { USB_AUDIO_TELEPHONE_IO, "Telephone" }, - { USB_AUDIO_DOWNLINE_PHONE_IO, "Down Line Phone" }, - // External Terminal Types - { USB_AUDIO_UNDEFINEDEXT_IO, "Undefined External I/O" }, - { USB_AUDIO_ANALOG_CONNECTOR_IO, "Analog Connector" }, - { USB_AUDIO_DAINTERFACE_IO, "Digital Audio Interface" }, - { USB_AUDIO_LINE_CONNECTOR_IO, "Line Connector" }, - { USB_AUDIO_LEGACY_CONNECTOR_IO, "LegacyAudioConnector" }, - { USB_AUDIO_SPDIF_INTERFACE_IO, "S/PDIF Interface" }, - { USB_AUDIO_DA1394_STREAM_IO, "1394 DA Stream" }, - { USB_AUDIO_DV1394_STREAMSOUND_IO, "1394 DV Stream Soundtrack" }, - { USB_AUDIO_ADAT_LIGHTPIPE_IO, "Alesis DAT Stream" }, - { USB_AUDIO_TDIF_IO, "Tascam Digital Interface" }, - { USB_AUDIO_MADI_IO, "AES Multi-channel interface" }, - // Embedded Terminal Types - { USB_AUDIO_UNDEF_EMBEDDED_IO, "Undefined Embedded I/O" }, - { USB_AUDIO_LC_NOISE_SOURCE_OUT, "Level Calibration Noise Source" }, - { USB_AUDIO_EQUALIZATION_NOISE_OUT, "Equalization Noise" }, - { USB_AUDIO_CDPLAYER_IN, "CD Player" }, - { USB_AUDIO_DAT_IO, "DAT" }, - { USB_AUDIO_DCC_IO, "DCC" }, - { USB_AUDIO_MINI_DISK_IO, "Mini Disk" }, - { USB_AUDIO_ANALOG_TAPE_IO, "Analog Tape" }, - { USB_AUDIO_PHONOGRAPH_IN, "Phonograph" }, - { USB_AUDIO_VCR_AUDIO_IN, "VCR Audio" }, - { USB_AUDIO_VIDEO_DISC_AUDIO_IN, "Video Disc Audio" }, - { USB_AUDIO_DVD_AUDIO_IN, "DVD Audio" }, - { USB_AUDIO_TV_TUNER_AUDIO_IN, "TV Tuner Audio" }, - { USB_AUDIO_SAT_RECEIVER_AUDIO_IN, "Satellite Receiver Audio" }, - { USB_AUDIO_CABLE_TUNER_AUDIO_IN, "Cable Tuner Audio" }, - { USB_AUDIO_DSS_AUDIO_IN, "DSS Audio" }, - { USB_AUDIO_RADIO_RECEIVER_IN, "Radio Receiver" }, - { USB_AUDIO_RADIO_TRANSMITTER_IN, "Radio Transmitter" }, - { USB_AUDIO_MULTI_TRACK_RECORDER_IO,"Multi-track Recorder" }, - { USB_AUDIO_SYNTHESIZER_IO, "Synthesizer" }, - { USB_AUDIO_PIANO_IO, "Piano" }, - { USB_AUDIO_GUITAR_IO, "Guitar" }, - { USB_AUDIO_DRUMS_IO, "Percussion Instrument" }, - { USB_AUDIO_INSTRUMENT_IO, "Musical Instrument" } - }; - - for (size_t i = 0; _countof(termInfoPairs); i++) - if (termInfoPairs[i].type == TerminalType) - return termInfoPairs[i].description; -/* - 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(ERR, "Unknown Terminal Type: %#06x", TerminalType); - return "Unknown"; -} - // control id is encoded in following way // CS CN ID IF where: @@ -333,7 +98,7 @@ _Terminal::~_Terminal() const char* _Terminal::Name() { - return GetTerminalDescription(fTerminalType); + return _GetTerminalDescription(fTerminalType); } @@ -344,6 +109,94 @@ _Terminal::IsUSBIO() } +const char* +_Terminal::_GetTerminalDescription(uint16 TerminalType) +{ + static struct _pair { + uint16 type; + const char* description; + } termInfoPairs[] = { + // USB Terminal Types + { USB_AUDIO_UNDEFINED_USB_IO, "USB I/O" }, + { USB_AUDIO_STREAMING_USB_IO, "USB Streaming I/O" }, + { USB_AUDIO_VENDOR_USB_IO, "Vendor USB I/O" }, + // Input Terminal Types + { USB_AUDIO_UNDEFINED_IN, "Undefined Input" }, + { USB_AUDIO_MICROPHONE_IN, "Microphone" }, + { USB_AUDIO_DESKTOPMIC_IN, "Desktop Microphone" }, + { USB_AUDIO_PERSONALMIC_IN, "Personal Microphone" }, + { USB_AUDIO_OMNI_MIC_IN, "Omni-directional Mic" }, + { USB_AUDIO_MICS_ARRAY_IN, "Microphone Array" }, + { USB_AUDIO_PROC_MICS_ARRAY_IN, "Processing Mic Array" }, + // Output Terminal Types + { USB_AUDIO_UNDEFINED_OUT, "Undefined Output" }, + { USB_AUDIO_SPEAKER_OUT, "Speaker" }, + { USB_AUDIO_HEAD_PHONES_OUT, "Headphones" }, + { USB_AUDIO_HMD_AUDIO_OUT, "Head Mounted Disp.Audio" }, + { USB_AUDIO_DESKTOP_SPEAKER, "Desktop Speaker" }, + { USB_AUDIO_ROOM_SPEAKER, "Room Speaker" }, + { USB_AUDIO_COMM_SPEAKER, "Communication Speaker" }, + { USB_AUDIO_LFE_SPEAKER, "LFE Speaker" }, + // Bi-directional Terminal Types + { USB_AUDIO_UNDEFINED_IO, "Undefined I/O" }, + { USB_AUDIO_HANDSET_IO, "Handset" }, + { USB_AUDIO_HEADSET_IO, "Headset" }, + { USB_AUDIO_SPEAKER_PHONE_IO, "Speakerphone" }, + { USB_AUDIO_SPEAKER_PHONEES_IO, "Echo-supp Speakerphone" }, + { USB_AUDIO_SPEAKER_PHONEEC_IO, "Echo-cancel Speakerphone" }, + // Telephony Terminal Types + { USB_AUDIO_UNDEF_TELEPHONY_IO, "Undefined Telephony" }, + { USB_AUDIO_PHONE_LINE_IO, "Phone Line" }, + { USB_AUDIO_TELEPHONE_IO, "Telephone" }, + { USB_AUDIO_DOWNLINE_PHONE_IO, "Down Line Phone" }, + // External Terminal Types + { USB_AUDIO_UNDEFINEDEXT_IO, "Undefined External I/O" }, + { USB_AUDIO_ANALOG_CONNECTOR_IO, "Analog Connector" }, + { USB_AUDIO_DAINTERFACE_IO, "Digital Audio Interface" }, + { USB_AUDIO_LINE_CONNECTOR_IO, "Line Connector" }, + { USB_AUDIO_LEGACY_CONNECTOR_IO, "LegacyAudioConnector" }, + { USB_AUDIO_SPDIF_INTERFACE_IO, "S/PDIF Interface" }, + { USB_AUDIO_DA1394_STREAM_IO, "1394 DA Stream" }, + { USB_AUDIO_DV1394_STREAMSOUND_IO, "1394 DV Stream Soundtrack" }, + { USB_AUDIO_ADAT_LIGHTPIPE_IO, "Alesis DAT Stream" }, + { USB_AUDIO_TDIF_IO, "Tascam Digital Interface" }, + { USB_AUDIO_MADI_IO, "AES Multi-channel interface" }, + // Embedded Terminal Types + { USB_AUDIO_UNDEF_EMBEDDED_IO, "Undefined Embedded I/O" }, + { USB_AUDIO_LC_NOISE_SOURCE_OUT, "Level Calibration Noise Source" }, + { USB_AUDIO_EQUALIZATION_NOISE_OUT, "Equalization Noise" }, + { USB_AUDIO_CDPLAYER_IN, "CD Player" }, + { USB_AUDIO_DAT_IO, "DAT" }, + { USB_AUDIO_DCC_IO, "DCC" }, + { USB_AUDIO_MINI_DISK_IO, "Mini Disk" }, + { USB_AUDIO_ANALOG_TAPE_IO, "Analog Tape" }, + { USB_AUDIO_PHONOGRAPH_IN, "Phonograph" }, + { USB_AUDIO_VCR_AUDIO_IN, "VCR Audio" }, + { USB_AUDIO_VIDEO_DISC_AUDIO_IN, "Video Disc Audio" }, + { USB_AUDIO_DVD_AUDIO_IN, "DVD Audio" }, + { USB_AUDIO_TV_TUNER_AUDIO_IN, "TV Tuner Audio" }, + { USB_AUDIO_SAT_RECEIVER_AUDIO_IN, "Satellite Receiver Audio" }, + { USB_AUDIO_CABLE_TUNER_AUDIO_IN, "Cable Tuner Audio" }, + { USB_AUDIO_DSS_AUDIO_IN, "DSS Audio" }, + { USB_AUDIO_RADIO_RECEIVER_IN, "Radio Receiver" }, + { USB_AUDIO_RADIO_TRANSMITTER_IN, "Radio Transmitter" }, + { USB_AUDIO_MULTI_TRACK_RECORDER_IO,"Multi-track Recorder" }, + { USB_AUDIO_SYNTHESIZER_IO, "Synthesizer" }, + { USB_AUDIO_PIANO_IO, "Piano" }, + { USB_AUDIO_GUITAR_IO, "Guitar" }, + { USB_AUDIO_DRUMS_IO, "Percussion Instrument" }, + { USB_AUDIO_INSTRUMENT_IO, "Musical Instrument" } + }; + + for (size_t i = 0; _countof(termInfoPairs); i++) + if (termInfoPairs[i].type == TerminalType) + return termInfoPairs[i].description; + + TRACE(ERR, "Unknown Terminal Type: %#06x", TerminalType); + return "Unknown"; +} + + InputTerminal::InputTerminal(AudioControlInterface* interface, usb_audiocontrol_header_descriptor* Header) : @@ -357,7 +210,7 @@ InputTerminal::InputTerminal(AudioControlInterface* interface, TRACE(UAC, "Input Terminal ID:%d >>>\n", fID); TRACE(UAC, "Terminal type:%s (%#06x)\n", - GetTerminalDescription(fTerminalType), fTerminalType); + _GetTerminalDescription(fTerminalType), fTerminalType); TRACE(UAC, "Assoc.terminal:%d\n", fAssociatedTerminal); if (fInterface->SpecReleaseNumber() < 0x200) { @@ -406,7 +259,7 @@ OutputTerminal::OutputTerminal(AudioControlInterface* interface, TRACE(UAC, "Output Terminal ID:%d >>>\n", fID); TRACE(UAC, "Terminal type:%s (%#06x)\n", - GetTerminalDescription(fTerminalType), fTerminalType); + _GetTerminalDescription(fTerminalType), fTerminalType); TRACE(UAC, "Assoc.terminal:%d\n", fAssociatedTerminal); TRACE(UAC, "Source ID:%d\n", fSourceID); @@ -722,9 +575,9 @@ EffectUnit::EffectUnit(AudioControlInterface* interface, : _AudioControl(interface, Header) { - usb_audio_input_terminal_descriptor* D + usb_audio_input_terminal_descriptor* descriptor = (usb_audio_input_terminal_descriptor*) Header; - TRACE(UAC, "Effect Unit:%d >>>\n", D->terminal_id); + TRACE(UAC, "Effect Unit:%d >>>\n", descriptor->terminal_id); } @@ -1214,7 +1067,7 @@ AudioControlInterface::GetBusChannelsDescription( addedChannels += channels; } - // output channels should follow too + // input channels should follow too for (AudioControlsIterator I = fInputTerminals.Begin(); I != fInputTerminals.End(); I++) { _AudioControl* control = I->Value(); @@ -1229,7 +1082,7 @@ AudioControlInterface::GetBusChannelsDescription( } uint32 channels = GetTerminalChannels(Channels, - cluster, B_MULTI_INPUT_BUS); + cluster, B_MULTI_INPUT_BUS); Description->input_bus_channel_count += channels; addedChannels += channels; 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 5df574bd6b..fbd321563b 100644 --- a/src/add-ons/kernel/drivers/audio/usb_audio/AudioControlInterface.h +++ b/src/add-ons/kernel/drivers/audio/usb_audio/AudioControlInterface.h @@ -87,6 +87,7 @@ public: uint16 TerminalType() { return fTerminalType; } bool IsUSBIO(); virtual const char* Name(); + static const char* _GetTerminalDescription(uint16 TerminalType); protected: uint16 fTerminalType; 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 125d20a133..e1d5cc8430 100644 --- a/src/add-ons/kernel/drivers/audio/usb_audio/Device.cpp +++ b/src/add-ons/kernel/drivers/audio/usb_audio/Device.cpp @@ -312,14 +312,15 @@ Device::_MultiGetDescription(multi_description* multiDescription) for (int i = 0; i < fStreams.Count(); i++) { uint8 id = fStreams[i]->TerminalLink(); _AudioControl* control = fAudioControl.Find(id); - // if (control->SubType() == IDSOutputTerminal) { + //if (control->SubType() == USB_AUDIO_AC_OUTPUT_TERMINAL) { + // if (control->SubType() == USB_AUDIO_AC_INPUT_TERMINAL) { // USBTerminals.PushFront(control); // fStreams[i]->GetFormatsAndRates(Description); // } else // if (control->SubType() == IDSInputTerminal) { USBTerminals.PushBack(control); fStreams[i]->GetFormatsAndRates(&Description); - // } + //} } Vector Channels; @@ -335,7 +336,7 @@ Device::_MultiGetDescription(multi_description* multiDescription) return B_BAD_ADDRESS; if (user_memcpy(multiDescription->channels, - &Channels[0], min_c(Channels.Count(), + &Channels[0], sizeof(multi_channel_info) * min_c(Channels.Count(), Description.request_channel_count)) != B_OK) return B_BAD_ADDRESS; @@ -472,6 +473,33 @@ Device::_MultiGetBuffers(multi_buffer_list* List) for (int i = 0; i < fStreams.Count() && status == B_OK; i++) status = fStreams[i]->GetBuffers(List); + TRACE(API, "flags:%#x\n" + "return_playback_buffers:%d\n" + "return_playback_channels:%d\n" + "return_playback_buffer_size:%d\n" + "return_record_buffers:%d\n" + "return_record_channels:%d\n" + "return_record_buffer_size:%d\n", + List->flags, + List->return_playback_buffers, + List->return_playback_channels, + List->return_playback_buffer_size, + List->return_record_buffers, + List->return_record_channels, + List->return_record_buffer_size); + + TRACE(API, "playback buffers\n"); + for (int32_t b = 0; b < List->return_playback_buffers; b++) + for (int32 c = 0; c < List->return_playback_channels; c++) + TRACE(API, "%d:%d %08x:%d\n", b, c, List->playback_buffers[b][c].base, + List->playback_buffers[b][c].stride); + + TRACE(API, "record buffers:\n"); + for (int32_t b = 0; b < List->return_record_buffers; b++) + for (int32 c = 0; c < List->return_record_channels; c++) + TRACE(API, "%d:%d %08x:%d\n", b, c, List->record_buffers[b][c].base, + List->record_buffers[b][c].stride); + return B_OK; } @@ -487,18 +515,23 @@ Device::_MultiBufferExchange(multi_buffer_info* multiInfo) if (!fStreams[i]->IsRunning()) fStreams[i]->Start(); - status_t status = B_ERROR; - bool anyBufferProcessed = false; - for (int i = 0; i < fStreams.Count() && !anyBufferProcessed; i++) { - status = acquire_sem_etc(fBuffersReadySem, 1, - B_RELATIVE_TIMEOUT | B_CAN_INTERRUPT, 50000); - if (status == B_TIMED_OUT) { - TRACE(ERR, "Timeout during buffers exchange.\n"); + status_t status = acquire_sem_etc(fBuffersReadySem, 1, + B_RELATIVE_TIMEOUT | B_CAN_INTERRUPT, 50000); + if (status == B_TIMED_OUT) { + TRACE(ERR, "Timeout during buffers exchange.\n"); + return status; + } + + status = B_ERROR; + for (int i = 0; i < fStreams.Count(); i++) + if (fStreams[i]->ExchangeBuffer(&Info)) { + status = B_OK; break; } - anyBufferProcessed = fStreams[i]->ExchangeBuffer(&Info); - status = anyBufferProcessed ? B_OK : B_ERROR; + if (status != B_OK) { + TRACE(ERR, "Error processing buffers:%08x.\n", status); + return status; } if (user_memcpy(multiInfo, &Info, sizeof(multi_buffer_info)) != B_OK) 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 f38b7bb1b6..ef74e291fc 100644 --- a/src/add-ons/kernel/drivers/audio/usb_audio/Driver.cpp +++ b/src/add-ons/kernel/drivers/audio/usb_audio/Driver.cpp @@ -177,7 +177,7 @@ usb_audio_open(const char* name, uint32 flags, void** cookie) *cookie = NULL; status_t status = ENODEV; - int32 index = strtol(name + strlen(sDeviceBaseName), NULL, 10); + int32 index = strtol(name + strlen(sDeviceBaseName), NULL, 10) - 1; if (index >= 0 && index < MAX_DEVICES && gDevices[index]) { status = gDevices[index]->Open(flags); *cookie = gDevices[index]; @@ -260,7 +260,7 @@ publish_devices() gDeviceNames[deviceCount] = (char*)malloc(strlen(sDeviceBaseName) + 4); if (gDeviceNames[deviceCount]) { - sprintf(gDeviceNames[deviceCount], "%s%ld", sDeviceBaseName, i); + sprintf(gDeviceNames[deviceCount], "%s%ld", sDeviceBaseName, i + 1); TRACE(INF, "publishing %s\n", gDeviceNames[deviceCount]); deviceCount++; } else 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 442507af00..dc42217a0e 100644 --- a/src/add-ons/kernel/drivers/audio/usb_audio/Settings.cpp +++ b/src/add-ons/kernel/drivers/audio/usb_audio/Settings.cpp @@ -18,11 +18,9 @@ #include "Driver.h" -//bool gTraceOn = false; uint32 gTraceMask = ERR; bool gTruncateLogFile = false; bool gAddTimeStamp = true; -//bool gTraceFlow = false; static char* gLogFilePath = NULL; mutex gLogLock; @@ -47,10 +45,7 @@ void load_settings() if (handle == 0) return; - //gTraceOn = get_driver_boolean_parameter(handle, "trace", gTraceOn, true); gTraceMask = strtoul(get_driver_parameter(handle, "trace", "1", "0"), 0, 0); - //gTraceFlow = get_driver_boolean_parameter(handle, "trace_flow", - // gTraceFlow, true); gTruncateLogFile = get_driver_boolean_parameter(handle, "truncate_logfile", gTruncateLogFile, true); gAddTimeStamp = get_driver_boolean_parameter(handle, "add_timestamp", @@ -77,7 +72,6 @@ void release_settings() void usb_audio_trace(uint32 bits, const char* func, const char* fmt, ...) { - //if (!(force || gTraceOn)) if ((gTraceMask & bits) == 0) return; 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 68f935c7e6..e25b93cca3 100644 --- a/src/add-ons/kernel/drivers/audio/usb_audio/Settings.h +++ b/src/add-ons/kernel/drivers/audio/usb_audio/Settings.h @@ -13,7 +13,7 @@ enum { ERR = 0x00000001, INF = 0x00000002, MIX = 0x00000004, - API = 0x00000080, + API = 0x00000008, DTA = 0x00000010, ISO = 0x00000020, UAC = 0x00000040 @@ -24,18 +24,17 @@ void release_settings(); void usb_audio_trace(uint32 bits, const char* func, const char* fmt, ...); +#define TRACE_USB_AUDIO + #ifdef TRACE #undef TRACE #endif +#ifdef TRACE_USB_AUDIO #define TRACE(__mask__, x...) usb_audio_trace(__mask__, __func__, x) -//#define TRACE(mask, x...) usb_audio_trace(true, __func__, x) - -//extern bool gTraceFlow; -//#define TRACE_FLOW(x...) usb_audio_trace(gTraceFlow, NULL, x) - -//#define TRACE_RET(result) usb_audio_trace(false, __func__, -// "Returns:%#010x\n", result); +#else +#define TRACE(__mask__, x...) // nothing +#endif #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 1621be5614..273e56f0df 100644 --- a/src/add-ons/kernel/drivers/audio/usb_audio/Stream.cpp +++ b/src/add-ons/kernel/drivers/audio/usb_audio/Stream.cpp @@ -116,6 +116,9 @@ Stream::_ChooseAlternate() fIsInput = (endpoint->fEndpointAddress & USB_ENDPOINT_ADDR_DIR_IN) == USB_ENDPOINT_ADDR_DIR_IN; +// if (fIsInput) +// fCurrentBuffer = -1; + TRACE(INF, "Alternate %d EP:%x selected for %s!\n", fActiveAlternate, endpoint->fEndpointAddress, fIsInput ? "recording" : "playback"); @@ -255,11 +258,11 @@ Stream::Start() { status_t result = B_BUSY; if (!fIsRunning) { - if (!fIsInput) { // TODO: recording + //if (!fIsInput) { // TODO: recording for (size_t i = 0; i < kSamplesBufferCount; i++) result = _QueueNextTransfer(i, true); - } else - result = B_OK; + //} else + // result = B_OK; fIsRunning = result == B_OK; } return result; @@ -524,11 +527,11 @@ Stream::GetBuffers(multi_buffer_list* List) bool Stream::ExchangeBuffer(multi_buffer_info* Info) { - if (fProcessedBuffers <= 0) { + if (fProcessedBuffers <= 0) //{ // looks like somebody else has processed buffers but this stream - release_sem_etc(fDevice->fBuffersReadySem, 1, B_DO_NOT_RESCHEDULE); +// release_sem_etc(fDevice->fBuffersReadySem, 1, B_DO_NOT_RESCHEDULE); return false; - } +// } if (fIsInput) { Info->recorded_real_time = system_time();// TODO fRealTime;