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.
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -87,6 +87,7 @@ public:
|
||||
uint16 TerminalType() { return fTerminalType; }
|
||||
bool IsUSBIO();
|
||||
virtual const char* Name();
|
||||
static const char* _GetTerminalDescription(uint16 TerminalType);
|
||||
|
||||
protected:
|
||||
uint16 fTerminalType;
|
||||
|
||||
@@ -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<multi_channel_info> 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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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_
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user