some more work on sound card channel mapping support for Windows
This commit is contained in:
parent
9828ceec81
commit
cc6b8a85f8
3 changed files with 222 additions and 14 deletions
|
@ -5,8 +5,8 @@
|
||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>562</width>
|
<width>535</width>
|
||||||
<height>310</height>
|
<height>382</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="windowTitle" >
|
<property name="windowTitle" >
|
||||||
|
@ -205,6 +205,150 @@
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QFrame" name="FrameSoundcardChannelSelection" >
|
||||||
|
<property name="sizePolicy" >
|
||||||
|
<sizepolicy vsizetype="Preferred" hsizetype="Preferred" >
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="frameShape" >
|
||||||
|
<enum>QFrame::NoFrame</enum>
|
||||||
|
</property>
|
||||||
|
<property name="frameShadow" >
|
||||||
|
<enum>QFrame::Plain</enum>
|
||||||
|
</property>
|
||||||
|
<layout class="QVBoxLayout" >
|
||||||
|
<property name="leftMargin" >
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="topMargin" >
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="rightMargin" >
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="bottomMargin" >
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="lbInChannelMapping" >
|
||||||
|
<property name="text" >
|
||||||
|
<string>Input Channel Mapping</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<layout class="QHBoxLayout" >
|
||||||
|
<property name="spacing" >
|
||||||
|
<number>3</number>
|
||||||
|
</property>
|
||||||
|
<item>
|
||||||
|
<layout class="QVBoxLayout" >
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="labelLInChan" >
|
||||||
|
<property name="sizePolicy" >
|
||||||
|
<sizepolicy vsizetype="Preferred" hsizetype="Maximum" >
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="text" >
|
||||||
|
<string>L</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="labelRInChan" >
|
||||||
|
<property name="sizePolicy" >
|
||||||
|
<sizepolicy vsizetype="Preferred" hsizetype="Maximum" >
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="text" >
|
||||||
|
<string>R</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<layout class="QVBoxLayout" >
|
||||||
|
<property name="spacing" >
|
||||||
|
<number>3</number>
|
||||||
|
</property>
|
||||||
|
<item>
|
||||||
|
<widget class="QComboBox" name="cbLInChan" />
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QComboBox" name="cbRInChan" />
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="lbOutChannelMapping" >
|
||||||
|
<property name="text" >
|
||||||
|
<string>Output Channel Mapping</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<layout class="QHBoxLayout" >
|
||||||
|
<property name="spacing" >
|
||||||
|
<number>3</number>
|
||||||
|
</property>
|
||||||
|
<item>
|
||||||
|
<layout class="QVBoxLayout" >
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="labelLOutChan" >
|
||||||
|
<property name="sizePolicy" >
|
||||||
|
<sizepolicy vsizetype="Preferred" hsizetype="Maximum" >
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="text" >
|
||||||
|
<string>L</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="labelROutChan" >
|
||||||
|
<property name="sizePolicy" >
|
||||||
|
<sizepolicy vsizetype="Preferred" hsizetype="Maximum" >
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="text" >
|
||||||
|
<string>R</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<layout class="QVBoxLayout" >
|
||||||
|
<property name="spacing" >
|
||||||
|
<number>3</number>
|
||||||
|
</property>
|
||||||
|
<item>
|
||||||
|
<widget class="QComboBox" name="cbLOutChan" />
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QComboBox" name="cbROutChan" />
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<spacer>
|
<spacer>
|
||||||
<property name="orientation" >
|
<property name="orientation" >
|
||||||
|
@ -212,8 +356,8 @@
|
||||||
</property>
|
</property>
|
||||||
<property name="sizeHint" >
|
<property name="sizeHint" >
|
||||||
<size>
|
<size>
|
||||||
<width>71</width>
|
<width>153</width>
|
||||||
<height>16</height>
|
<height>0</height>
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
</spacer>
|
</spacer>
|
||||||
|
|
|
@ -231,8 +231,6 @@ QString CSound::CheckDeviceCapabilities()
|
||||||
}
|
}
|
||||||
|
|
||||||
// check the number of available channels
|
// check the number of available channels
|
||||||
long lNumInChan;
|
|
||||||
long lNumOutChan;
|
|
||||||
ASIOGetChannels ( &lNumInChan, &lNumOutChan );
|
ASIOGetChannels ( &lNumInChan, &lNumOutChan );
|
||||||
if ( ( lNumInChan < NUM_IN_OUT_CHANNELS ) ||
|
if ( ( lNumInChan < NUM_IN_OUT_CHANNELS ) ||
|
||||||
( lNumOutChan < NUM_IN_OUT_CHANNELS ) )
|
( lNumOutChan < NUM_IN_OUT_CHANNELS ) )
|
||||||
|
@ -298,10 +296,50 @@ QString CSound::CheckDeviceCapabilities()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// the device has changed, per definition we reset the channel
|
||||||
|
// mapping to the defaults (first two available channels)
|
||||||
|
ResetChannelMapping();
|
||||||
|
|
||||||
// everything is ok, return empty string for "no error" case
|
// everything is ok, return empty string for "no error" case
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CSound::SetLeftInputChannel ( const int iNewChan )
|
||||||
|
{
|
||||||
|
// apply parameter after input parameter check
|
||||||
|
if ( ( iNewChan >= 0 ) && ( iNewChan < lNumInChan ) )
|
||||||
|
{
|
||||||
|
vSelectedInputChannels[0] = iNewChan;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSound::SetRightInputChannel ( const int iNewChan )
|
||||||
|
{
|
||||||
|
// apply parameter after input parameter check
|
||||||
|
if ( ( iNewChan >= 0 ) && ( iNewChan < lNumInChan ) )
|
||||||
|
{
|
||||||
|
vSelectedInputChannels[1] = iNewChan;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSound::SetLeftOutputChannel ( const int iNewChan )
|
||||||
|
{
|
||||||
|
// apply parameter after input parameter check
|
||||||
|
if ( ( iNewChan >= 0 ) && ( iNewChan < lNumOutChan ) )
|
||||||
|
{
|
||||||
|
vSelectedOutputChannels[0] = iNewChan;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSound::SetRightOutputChannel ( const int iNewChan )
|
||||||
|
{
|
||||||
|
// apply parameter after input parameter check
|
||||||
|
if ( ( iNewChan >= 0 ) && ( iNewChan < lNumOutChan ) )
|
||||||
|
{
|
||||||
|
vSelectedOutputChannels[1] = iNewChan;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int CSound::GetActualBufferSize ( const int iDesiredBufferSizeMono )
|
int CSound::GetActualBufferSize ( const int iDesiredBufferSizeMono )
|
||||||
{
|
{
|
||||||
int iActualBufferSizeMono;
|
int iActualBufferSizeMono;
|
||||||
|
@ -485,7 +523,9 @@ void CSound::Stop()
|
||||||
CSound::CSound ( void (*fpNewCallback) ( CVector<int16_t>& psData, void* arg ), void* arg ) :
|
CSound::CSound ( void (*fpNewCallback) ( CVector<int16_t>& psData, void* arg ), void* arg ) :
|
||||||
CSoundBase ( true, fpNewCallback, arg ),
|
CSoundBase ( true, fpNewCallback, arg ),
|
||||||
vSelectedInputChannels ( NUM_IN_OUT_CHANNELS ),
|
vSelectedInputChannels ( NUM_IN_OUT_CHANNELS ),
|
||||||
vSelectedOutputChannels ( NUM_IN_OUT_CHANNELS )
|
vSelectedOutputChannels ( NUM_IN_OUT_CHANNELS ),
|
||||||
|
lNumInChan ( 0 ),
|
||||||
|
lNumOutChan ( 0 )
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
@ -517,12 +557,8 @@ CSound::CSound ( void (*fpNewCallback) ( CVector<int16_t>& psData, void* arg ),
|
||||||
// init device index with illegal value to show that driver is not initialized
|
// init device index with illegal value to show that driver is not initialized
|
||||||
lCurDev = -1;
|
lCurDev = -1;
|
||||||
|
|
||||||
// init selected channel numbers with defaults: use first available
|
// init channel mapping
|
||||||
// channels for input and output
|
ResetChannelMapping();
|
||||||
vSelectedInputChannels[0] = 0;
|
|
||||||
vSelectedInputChannels[1] = 1;
|
|
||||||
vSelectedOutputChannels[0] = 0;
|
|
||||||
vSelectedOutputChannels[1] = 1;
|
|
||||||
|
|
||||||
// set up the asioCallback structure
|
// set up the asioCallback structure
|
||||||
asioCallbacks.bufferSwitch = &bufferSwitch;
|
asioCallbacks.bufferSwitch = &bufferSwitch;
|
||||||
|
@ -531,6 +567,16 @@ CSound::CSound ( void (*fpNewCallback) ( CVector<int16_t>& psData, void* arg ),
|
||||||
asioCallbacks.bufferSwitchTimeInfo = &bufferSwitchTimeInfo;
|
asioCallbacks.bufferSwitchTimeInfo = &bufferSwitchTimeInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CSound::ResetChannelMapping()
|
||||||
|
{
|
||||||
|
// init selected channel numbers with defaults: use first available
|
||||||
|
// channels for input and output
|
||||||
|
vSelectedInputChannels[0] = 0;
|
||||||
|
vSelectedInputChannels[1] = 1;
|
||||||
|
vSelectedOutputChannels[0] = 0;
|
||||||
|
vSelectedOutputChannels[1] = 1;
|
||||||
|
}
|
||||||
|
|
||||||
CSound::~CSound()
|
CSound::~CSound()
|
||||||
{
|
{
|
||||||
// cleanup ASIO stuff
|
// cleanup ASIO stuff
|
||||||
|
|
|
@ -63,22 +63,40 @@ public:
|
||||||
|
|
||||||
virtual void OpenDriverSetup() { ASIOControlPanel(); }
|
virtual void OpenDriverSetup() { ASIOControlPanel(); }
|
||||||
|
|
||||||
|
// device selection
|
||||||
int GetNumDev() { return lNumDevs; }
|
int GetNumDev() { return lNumDevs; }
|
||||||
QString GetDeviceName ( const int iDiD ) { return cDriverNames[iDiD]; }
|
QString GetDeviceName ( const int iDiD ) { return cDriverNames[iDiD]; }
|
||||||
|
|
||||||
QString SetDev ( const int iNewDev );
|
QString SetDev ( const int iNewDev );
|
||||||
int GetDev() { return lCurDev; }
|
int GetDev() { return lCurDev; }
|
||||||
|
|
||||||
|
// channel selection
|
||||||
|
int GetNumInputChannels() { return static_cast<int> ( lNumInChan ); }
|
||||||
|
QString GetInputChannelName ( const int iDiD ) { return channelInfosInput[iDiD].name; }
|
||||||
|
void SetLeftInputChannel ( const int iNewChan );
|
||||||
|
void SetRightInputChannel ( const int iNewChan );
|
||||||
|
int GetLeftInputChannel() { return vSelectedInputChannels[0]; }
|
||||||
|
int GetRightInputChannel() { return vSelectedInputChannels[1]; }
|
||||||
|
|
||||||
|
int GetNumOutputChannels() { return static_cast<int> ( lNumOutChan ); }
|
||||||
|
QString GetOutputChannelName ( const int iDiD ) { return channelInfosOutput[iDiD].name; }
|
||||||
|
void SetLeftOutputChannel ( const int iNewChan );
|
||||||
|
void SetRightOutputChannel ( const int iNewChan );
|
||||||
|
int GetLeftOutputChannel() { return vSelectedOutputChannels[0]; }
|
||||||
|
int GetRightOutputChannel() { return vSelectedOutputChannels[1]; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
QVector<QString> LoadAndInitializeFirstValidDriver();
|
QVector<QString> LoadAndInitializeFirstValidDriver();
|
||||||
QString LoadAndInitializeDriver ( int iIdx );
|
QString LoadAndInitializeDriver ( int iIdx );
|
||||||
int GetActualBufferSize ( const int iDesiredBufferSizeMono );
|
int GetActualBufferSize ( const int iDesiredBufferSizeMono );
|
||||||
QString CheckDeviceCapabilities();
|
QString CheckDeviceCapabilities();
|
||||||
bool CheckSampleTypeSupported ( const ASIOSampleType SamType );
|
bool CheckSampleTypeSupported ( const ASIOSampleType SamType );
|
||||||
|
void ResetChannelMapping();
|
||||||
|
|
||||||
int iASIOBufferSizeMono;
|
int iASIOBufferSizeMono;
|
||||||
int iASIOBufferSizeStereo;
|
int iASIOBufferSizeStereo;
|
||||||
|
|
||||||
|
long lNumInChan;
|
||||||
|
long lNumOutChan;
|
||||||
CVector<int> vSelectedInputChannels;
|
CVector<int> vSelectedInputChannels;
|
||||||
CVector<int> vSelectedOutputChannels;
|
CVector<int> vSelectedOutputChannels;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue