Added Support for instrument picture on fader tag

This commit is contained in:
Volker Fischer 2013-02-11 15:21:53 +00:00
parent ead6092b56
commit 0f976c4c4c
6 changed files with 240 additions and 81 deletions

View file

@ -52,6 +52,7 @@ public:
CChannelFader ( QWidget* pNW, QHBoxLayout* pParentLayout );
void SetText ( const QString sText );
void SetInstrumentPicture ( const int iInstrument );
void Show() { pFrame->show(); }
void Hide() { pFrame->hide(); }
bool IsVisible() { return pLabel->isVisible(); }
@ -93,12 +94,12 @@ public:
CAudioMixerBoard ( QWidget* parent = 0, Qt::WindowFlags f = 0 );
void HideAll();
void ApplyNewConClientList ( CVector<CChannelShortInfo>& vecChanInfo );
void ApplyNewConClientList ( CVector<CChannelInfo>& vecChanInfo );
void SetServerName ( const QString& strNewServerName );
void SetGUIDesign ( const EGUIDesign eNewDesign );
protected:
QString GenFaderText ( CChannelShortInfo& ChanInfo );
QString GenFaderText ( CChannelInfo& ChanInfo );
void OnChSoloStateChanged ( const int iChannelIdx, const int iValue );
CVector<CChannelFader*> vecpChanFader;

View file

@ -216,7 +216,7 @@ public:
void SetRemoteChanGain ( const int iId, const double dGain )
{ Channel.SetRemoteChanGain ( iId, dGain ); }
void SetRemoteName() { Channel.SetRemoteName ( strName ); }
void SetRemoteInfo() { Channel.SetRemoteInfo ( ChannelInfo ); }
void CreateChatTextMes ( const QString& strChatText )
{ Channel.CreateChatTextMes ( strChatText ); }
@ -240,7 +240,7 @@ public:
// settings
CVector<QString> vstrIPAddress;
QString strName;
CChannelCoreInfo ChannelInfo;
#ifdef LLCON_VST_PLUGIN
// VST version must have direct access to sound object
@ -324,7 +324,7 @@ public slots:
void OnDetectedCLMessage ( CVector<uint8_t> vecbyData, int iNumBytes );
void OnReqJittBufSize() { CreateServerJitterBufferMessage(); }
void OnJittBufSizeChanged ( int iNewJitBufSize );
void OnReqChanName() { Channel.SetRemoteName ( strName ); }
void OnReqChanInfo() { Channel.SetRemoteInfo ( ChannelInfo ); }
void OnNewConnection();
void OnCLPingReceived ( CHostAddress InetAddr,
int iMs );
@ -337,7 +337,8 @@ public slots:
void OnSndCrdReinitRequest ( int iSndCrdResetType );
signals:
void ConClientListMesReceived ( CVector<CChannelShortInfo> vecChanInfo );
void ConClientListNameMesReceived ( CVector<CChannelInfo> vecChanInfo );
void ConClientListMesReceived ( CVector<CChannelInfo> vecChanInfo );
void ChatTextReceived ( QString strChatText );
void PingTimeReceived ( int iPingTime );
void CLServerListReceived ( CHostAddress InetAddr,

View file

@ -64,7 +64,7 @@ MESSAGES (with connection)
+-------------------+--------------+
- PROTMESSID_CONN_CLIENTS_LIST: IP number and name of connected clients
- PROTMESSID_CONN_CLIENTS_LIST_NAME: IP number and name of connected clients
for each connected client append following data:
@ -76,17 +76,19 @@ MESSAGES (with connection)
... ----------------------+
- PROTMESSID_CONN_CLIENTS_LIST_ADD: Additional information about connected
clients
- PROTMESSID_CONN_CLIENTS_LIST: Information about connected clients
for each connected client append following data:
+-------------------+-----------------+--------------------+ ...
| 1 byte channel ID | 2 bytes country | 4 bytes instrument | ...
+-------------------+-----------------+--------------------+ ...
... --------------------+ ...
... 1 byte skill level | ...
... --------------------+ ...
... --------------------+--------------------+ ...
... 1 byte skill level | 4 bytes IP address | ...
... --------------------+--------------------+ ...
... ------------------+---------------------------+
... 2 bytes number n | n bytes UTF-8 string name |
... ------------------+---------------------------+
... ------------------+---------------------------+
... 2 bytes number n | n bytes UTF-8 string city |
... ------------------+---------------------------+
@ -99,14 +101,28 @@ MESSAGES (with connection)
- PROTMESSID_CHANNEL_NAME: Name of channel
for each connected client append following data:
+------------------+----------------------+
| 2 bytes number n | n bytes UTF-8 string |
+------------------+----------------------+
- PROTMESSID_REQ_CHANNEL_NAME: Request name of channel
- PROTMESSID_CHANNEL_INFOS: Information about the channel
+-----------------+--------------------+ ...
| 2 bytes country | 4 bytes instrument | ...
+-----------------+--------------------+ ...
... --------------------+ ...
... 1 byte skill level | ...
... --------------------+ ...
... ------------------+---------------------------+ ...
... 2 bytes number n | n bytes UTF-8 string name | ...
... ------------------+---------------------------+ ...
... ------------------+---------------------------+
... 2 bytes number n | n bytes UTF-8 string city |
... ------------------+---------------------------+
- PROTMESSID_REQ_CHANNEL_INFOS: Request infos of the channel
note: does not have any data -> n = 0
@ -514,24 +530,30 @@ if ( rand() < ( RAND_MAX / 2 ) ) return false;
bRet = EvaluateChanGainMes ( vecData );
break;
case PROTMESSID_CONN_CLIENTS_LIST:
bRet = EvaluateConClientListMes ( vecData );
// #### COMPATIBILITY OLD VERSION, TO BE REMOVED ####
case PROTMESSID_CONN_CLIENTS_LIST_NAME:
bRet = EvaluateConClientListNameMes ( vecData );
break;
case PROTMESSID_CONN_CLIENTS_LIST_ADD:
bRet = EvaluateConClientListAddMes ( vecData );
case PROTMESSID_CONN_CLIENTS_LIST:
bRet = EvaluateConClientListMes ( vecData );
break;
case PROTMESSID_REQ_CONN_CLIENTS_LIST:
bRet = EvaluateReqConnClientsList();
break;
case PROTMESSID_CHANNEL_NAME:
// #### COMPATIBILITY OLD VERSION, TO BE REMOVED ####
case PROTMESSID_CHANNEL_NAME:
bRet = EvaluateChanNameMes ( vecData );
break;
case PROTMESSID_REQ_CHANNEL_NAME:
bRet = EvaluateReqChanNameMes();
case PROTMESSID_CHANNEL_INFOS:
bRet = EvaluateChanInfoMes ( vecData );
break;
case PROTMESSID_REQ_CHANNEL_INFOS:
bRet = EvaluateReqChanInfoMes();
break;
case PROTMESSID_CHAT_TEXT:
@ -744,7 +766,7 @@ bool CProtocol::EvaluateChanGainMes ( const CVector<uint8_t>& vecData )
return false; // no error
}
void CProtocol::CreateConClientListMes ( const CVector<CChannelShortInfo>& vecChanInfo )
void CProtocol::CreateConClientListNameMes ( const CVector<CChannelInfo>& vecChanInfo )
{
const int iNumClients = vecChanInfo.Size();
@ -777,14 +799,14 @@ void CProtocol::CreateConClientListMes ( const CVector<CChannelShortInfo>& vecCh
PutStringUTF8OnStream ( vecData, iPos, strUTF8Name );
}
CreateAndSendMessage ( PROTMESSID_CONN_CLIENTS_LIST, vecData );
CreateAndSendMessage ( PROTMESSID_CONN_CLIENTS_LIST_NAME, vecData );
}
bool CProtocol::EvaluateConClientListMes ( const CVector<uint8_t>& vecData )
bool CProtocol::EvaluateConClientListNameMes ( const CVector<uint8_t>& vecData )
{
int iPos = 0; // init position pointer
const int iDataLen = vecData.Size();
CVector<CChannelShortInfo> vecChanInfo ( 0 );
CVector<CChannelInfo> vecChanInfo ( 0 );
while ( iPos < iDataLen )
{
@ -813,7 +835,7 @@ bool CProtocol::EvaluateConClientListMes ( const CVector<uint8_t>& vecData )
}
// add channel information to vector
vecChanInfo.Add ( CChannelShortInfo ( iChanID, iIpAddr, strCurStr ) );
vecChanInfo.Add ( CChannelInfo ( iChanID, iIpAddr, strCurStr ) );
}
// check size: all data is read, the position must now be at the end
@ -823,12 +845,12 @@ bool CProtocol::EvaluateConClientListMes ( const CVector<uint8_t>& vecData )
}
// invoke message action
emit ConClientListMesReceived ( vecChanInfo );
emit ConClientListNameMesReceived ( vecChanInfo );
return false; // no error
}
void CProtocol::CreateConClientListAddMes ( const CVector<CChannelAdditionalInfo>& vecChanInfo )
void CProtocol::CreateConClientListMes ( const CVector<CChannelInfo>& vecChanInfo )
{
const int iNumClients = vecChanInfo.Size();
@ -838,13 +860,16 @@ void CProtocol::CreateConClientListAddMes ( const CVector<CChannelAdditionalInfo
for ( int i = 0; i < iNumClients; i++ )
{
// convert city string to utf-8
// convert strings to utf-8
const QByteArray strUTF8Name = vecChanInfo[i].strName.toUtf8();
const QByteArray strUTF8City = vecChanInfo[i].strCity.toUtf8();
// size of current list entry
const int iCurListEntrLen =
1 /* chan ID */ + 2 /* country */ +
4 /* instrument */ + 1 /* skill level */ +
4 /* IP address */ +
2 /* utf-8 str. size */ + strUTF8Name.size() +
2 /* utf-8 str. size */ + strUTF8City.size();
// make space for new data
@ -864,25 +889,32 @@ void CProtocol::CreateConClientListAddMes ( const CVector<CChannelAdditionalInfo
// skill level (1 byte)
PutValOnStream ( vecData, iPos,
static_cast<uint32_t> ( vecChanInfo[i].iSkillLevel ), 1 );
static_cast<uint32_t> ( vecChanInfo[i].eSkillLevel ), 1 );
// IP address (4 bytes)
PutValOnStream ( vecData, iPos,
static_cast<uint32_t> ( vecChanInfo[i].iIpAddr ), 4 );
// name
PutStringUTF8OnStream ( vecData, iPos, strUTF8Name );
// city
PutStringUTF8OnStream ( vecData, iPos, strUTF8City );
}
CreateAndSendMessage ( PROTMESSID_CONN_CLIENTS_LIST_ADD, vecData );
CreateAndSendMessage ( PROTMESSID_CONN_CLIENTS_LIST, vecData );
}
bool CProtocol::EvaluateConClientListAddMes ( const CVector<uint8_t>& vecData )
bool CProtocol::EvaluateConClientListMes ( const CVector<uint8_t>& vecData )
{
int iPos = 0; // init position pointer
const int iDataLen = vecData.Size();
CVector<CChannelAdditionalInfo> vecChanInfo ( 0 );
CVector<CChannelInfo> vecChanInfo ( 0 );
while ( iPos < iDataLen )
{
// check size (the next 8 bytes)
if ( ( iDataLen - iPos ) < 8 )
// check size (the next 12 bytes)
if ( ( iDataLen - iPos ) < 12 )
{
return true; // return error code
}
@ -900,25 +932,41 @@ bool CProtocol::EvaluateConClientListAddMes ( const CVector<uint8_t>& vecData )
static_cast<int> ( GetValFromStream ( vecData, iPos, 4 ) );
// skill level (1 byte)
const int iSkillLevel =
static_cast<int> ( GetValFromStream ( vecData, iPos, 1 ) );
const ESkillLevel eSkillLevel =
static_cast<ESkillLevel> ( GetValFromStream ( vecData, iPos, 1 ) );
// IP address (4 bytes)
const int iIpAddr =
static_cast<int> ( GetValFromStream ( vecData, iPos, 4 ) );
// name
QString strCurName;
if ( GetStringFromStream ( vecData,
iPos,
MAX_LEN_FADER_TAG,
strCurName ) )
{
return true; // return error code
}
// city
QString strCurStr;
QString strCurCity;
if ( GetStringFromStream ( vecData,
iPos,
MAX_LEN_SERVER_CITY,
strCurStr ) )
strCurCity ) )
{
return true; // return error code
}
// add channel information to vector
vecChanInfo.Add ( CChannelAdditionalInfo ( iChanID,
vecChanInfo.Add ( CChannelInfo ( iChanID,
iIpAddr,
strCurName,
eCountry,
strCurStr,
strCurCity,
iInstrument,
iSkillLevel ) );
eSkillLevel ) );
}
// check size: all data is read, the position must now be at the end
@ -928,7 +976,7 @@ bool CProtocol::EvaluateConClientListAddMes ( const CVector<uint8_t>& vecData )
}
// invoke message action
emit ConClientListAddMesReceived ( vecChanInfo );
emit ConClientListMesReceived ( vecChanInfo );
return false; // no error
}
@ -993,15 +1041,108 @@ bool CProtocol::EvaluateChanNameMes ( const CVector<uint8_t>& vecData )
return false; // no error
}
void CProtocol::CreateReqChanNameMes()
void CProtocol::CreateChanInfoMes ( const CChannelCoreInfo ChanInfo )
{
CreateAndSendMessage ( PROTMESSID_REQ_CHANNEL_NAME, CVector<uint8_t> ( 0 ) );
int iPos = 0; // init position pointer
// convert strings to utf-8
const QByteArray strUTF8Name = ChanInfo.strName.toUtf8();
const QByteArray strUTF8City = ChanInfo.strCity.toUtf8();
// size of current list entry
const int iEntrLen =
2 /* country */ +
4 /* instrument */ + 1 /* skill level */ +
2 /* utf-8 str. size */ + strUTF8Name.size() +
2 /* utf-8 str. size */ + strUTF8City.size();
// build data vector
CVector<uint8_t> vecData ( iEntrLen );
// country (2 bytes)
PutValOnStream ( vecData, iPos,
static_cast<uint32_t> ( ChanInfo.eCountry ), 2 );
// instrument (4 bytes)
PutValOnStream ( vecData, iPos,
static_cast<uint32_t> ( ChanInfo.iInstrument ), 4 );
// skill level (1 byte)
PutValOnStream ( vecData, iPos,
static_cast<uint32_t> ( ChanInfo.eSkillLevel ), 1 );
// name
PutStringUTF8OnStream ( vecData, iPos, strUTF8Name );
// city
PutStringUTF8OnStream ( vecData, iPos, strUTF8City );
CreateAndSendMessage ( PROTMESSID_CHANNEL_INFOS, vecData );
}
bool CProtocol::EvaluateReqChanNameMes()
bool CProtocol::EvaluateChanInfoMes ( const CVector<uint8_t>& vecData )
{
int iPos = 0; // init position pointer
const int iDataLen = vecData.Size();
CChannelCoreInfo ChanInfo;
// check size (the first 7 bytes)
if ( iDataLen < 7 )
{
return true; // return error code
}
// country (2 bytes)
ChanInfo.eCountry =
static_cast<QLocale::Country> ( GetValFromStream ( vecData, iPos, 2 ) );
// instrument (4 bytes)
ChanInfo.iInstrument =
static_cast<int> ( GetValFromStream ( vecData, iPos, 4 ) );
// skill level (1 byte)
ChanInfo.eSkillLevel =
static_cast<ESkillLevel> ( GetValFromStream ( vecData, iPos, 1 ) );
// name
if ( GetStringFromStream ( vecData,
iPos,
MAX_LEN_FADER_TAG,
ChanInfo.strName ) )
{
return true; // return error code
}
// city
if ( GetStringFromStream ( vecData,
iPos,
MAX_LEN_SERVER_CITY,
ChanInfo.strCity ) )
{
return true; // return error code
}
// check size: all data is read, the position must now be at the end
if ( iPos != iDataLen )
{
return true; // return error code
}
// invoke message action
emit ChangeChanInfo ( ChanInfo );
return false; // no error
}
void CProtocol::CreateReqChanInfoMes()
{
CreateAndSendMessage ( PROTMESSID_REQ_CHANNEL_INFOS, CVector<uint8_t> ( 0 ) );
}
bool CProtocol::EvaluateReqChanInfoMes()
{
// invoke message action
emit ReqChanName();
emit ReqChanInfo();
return false; // no error
}

View file

@ -41,7 +41,7 @@
#define PROTMESSID_REQ_JITT_BUF_SIZE 11 // request jitter buffer size
#define PROTMESSID_NET_BLSI_FACTOR 12 // OLD (not used anymore)
#define PROTMESSID_CHANNEL_GAIN 13 // set channel gain for mix
#define PROTMESSID_CONN_CLIENTS_LIST 14 // connected client list
#define PROTMESSID_CONN_CLIENTS_LIST_NAME 14 // connected client list
#define PROTMESSID_SERVER_FULL 15 // OLD (not used anymore)
#define PROTMESSID_REQ_CONN_CLIENTS_LIST 16 // request connected client list
#define PROTMESSID_CHANNEL_NAME 17 // set channel name for fader tag
@ -50,8 +50,9 @@
#define PROTMESSID_NETW_TRANSPORT_PROPS 20 // properties for network transport
#define PROTMESSID_REQ_NETW_TRANSPORT_PROPS 21 // request properties for network transport
#define PROTMESSID_DISCONNECTION 22 // OLD (not used anymore)
#define PROTMESSID_REQ_CHANNEL_NAME 23 // request channel name for fader tag
#define PROTMESSID_CONN_CLIENTS_LIST_ADD 24 // additional infos for connected clients
#define PROTMESSID_REQ_CHANNEL_INFOS 23 // request channel infos for fader tag
#define PROTMESSID_CONN_CLIENTS_LIST 24 // channel infos for connected clients
#define PROTMESSID_CHANNEL_INFOS 25 // set channel infos
// message IDs of connection less messages (CLM)
// DEFINITION -> start at 1000, end at 1999, see IsConnectionLessMessageID
@ -88,11 +89,12 @@ public:
void CreateJitBufMes ( const int iJitBufSize );
void CreateReqJitBufMes();
void CreateChanGainMes ( const int iChanID, const double dGain );
void CreateConClientListMes ( const CVector<CChannelShortInfo>& vecChanInfo );
void CreateConClientListAddMes ( const CVector<CChannelAdditionalInfo>& vecChanInfo );
void CreateConClientListNameMes ( const CVector<CChannelInfo>& vecChanInfo );
void CreateConClientListMes ( const CVector<CChannelInfo>& vecChanInfo );
void CreateReqConnClientsList();
void CreateChanNameMes ( const QString strName );
void CreateReqChanNameMes();
void CreateChanInfoMes ( const CChannelCoreInfo ChanInfo );
void CreateReqChanInfoMes();
void CreateChatTextMes ( const QString strChatText );
void CreatePingMes ( const int iMs );
void CreateNetwTranspPropsMes ( const CNetworkTransportProps& NetTrProps );
@ -200,11 +202,12 @@ protected:
bool EvaluateJitBufMes ( const CVector<uint8_t>& vecData );
bool EvaluateReqJitBufMes();
bool EvaluateChanGainMes ( const CVector<uint8_t>& vecData );
bool EvaluateConClientListNameMes ( const CVector<uint8_t>& vecData );
bool EvaluateConClientListMes ( const CVector<uint8_t>& vecData );
bool EvaluateConClientListAddMes ( const CVector<uint8_t>& vecData );
bool EvaluateReqConnClientsList();
bool EvaluateChanNameMes ( const CVector<uint8_t>& vecData );
bool EvaluateReqChanNameMes();
bool EvaluateChanInfoMes ( const CVector<uint8_t>& vecData );
bool EvaluateReqChanInfoMes();
bool EvaluateChatTextMes ( const CVector<uint8_t>& vecData );
bool EvaluatePingMes ( const CVector<uint8_t>& vecData );
bool EvaluateNetwTranspPropsMes ( const CVector<uint8_t>& vecData );
@ -248,12 +251,13 @@ signals:
void ReqJittBufSize();
void ChangeNetwBlSiFact ( int iNewNetwBlSiFact );
void ChangeChanGain ( int iChanID, double dNewGain );
void ConClientListMesReceived ( CVector<CChannelShortInfo> vecChanInfo );
void ConClientListAddMesReceived ( CVector<CChannelAdditionalInfo> vecChanInfo );
void ConClientListNameMesReceived ( CVector<CChannelInfo> vecChanInfo );
void ConClientListMesReceived ( CVector<CChannelInfo> vecChanInfo );
void ServerFullMesReceived();
void ReqConnClientsList();
void ChangeChanName ( QString strName );
void ReqChanName();
void ChangeChanInfo ( CChannelCoreInfo ChanInfo );
void ReqChanInfo();
void ChatTextReceived ( QString strChatText );
void PingReceived ( int iMs );
void NetTranspPropsReceived ( CNetworkTransportProps NetworkTransportProps );

View file

@ -184,7 +184,7 @@ protected:
int GetFreeChan();
int FindChannel ( const CHostAddress& InetAddr );
int GetNumberOfConnectedClients();
CVector<CChannelShortInfo> CreateChannelList();
CVector<CChannelInfo> CreateChannelList();
void CreateAndSendChanListForAllConChannels();
void CreateAndSendChanListForThisChan ( const int iCurChanID );
void CreateAndSendChatTextForAllConChannels ( const int iCurChanID,
@ -342,18 +342,18 @@ public slots:
void OnReqConnClientsListCh10() { CreateAndSendChanListForThisChan ( 10 ); }
void OnReqConnClientsListCh11() { CreateAndSendChanListForThisChan ( 11 ); }
void OnNameHasChangedCh0() { CreateAndSendChanListForAllConChannels(); }
void OnNameHasChangedCh1() { CreateAndSendChanListForAllConChannels(); }
void OnNameHasChangedCh2() { CreateAndSendChanListForAllConChannels(); }
void OnNameHasChangedCh3() { CreateAndSendChanListForAllConChannels(); }
void OnNameHasChangedCh4() { CreateAndSendChanListForAllConChannels(); }
void OnNameHasChangedCh5() { CreateAndSendChanListForAllConChannels(); }
void OnNameHasChangedCh6() { CreateAndSendChanListForAllConChannels(); }
void OnNameHasChangedCh7() { CreateAndSendChanListForAllConChannels(); }
void OnNameHasChangedCh8() { CreateAndSendChanListForAllConChannels(); }
void OnNameHasChangedCh9() { CreateAndSendChanListForAllConChannels(); }
void OnNameHasChangedCh10() { CreateAndSendChanListForAllConChannels(); }
void OnNameHasChangedCh11() { CreateAndSendChanListForAllConChannels(); }
void OnChanInfoHasChangedCh0() { CreateAndSendChanListForAllConChannels(); }
void OnChanInfoHasChangedCh1() { CreateAndSendChanListForAllConChannels(); }
void OnChanInfoHasChangedCh2() { CreateAndSendChanListForAllConChannels(); }
void OnChanInfoHasChangedCh3() { CreateAndSendChanListForAllConChannels(); }
void OnChanInfoHasChangedCh4() { CreateAndSendChanListForAllConChannels(); }
void OnChanInfoHasChangedCh5() { CreateAndSendChanListForAllConChannels(); }
void OnChanInfoHasChangedCh6() { CreateAndSendChanListForAllConChannels(); }
void OnChanInfoHasChangedCh7() { CreateAndSendChanListForAllConChannels(); }
void OnChanInfoHasChangedCh8() { CreateAndSendChanListForAllConChannels(); }
void OnChanInfoHasChangedCh9() { CreateAndSendChanListForAllConChannels(); }
void OnChanInfoHasChangedCh10() { CreateAndSendChanListForAllConChannels(); }
void OnChanInfoHasChangedCh11() { CreateAndSendChanListForAllConChannels(); }
void OnChatTextReceivedCh0 ( QString strChatText ) { CreateAndSendChatTextForAllConChannels ( 0, strChatText ); }
void OnChatTextReceivedCh1 ( QString strChatText ) { CreateAndSendChatTextForAllConChannels ( 1, strChatText ); }

View file

@ -66,7 +66,15 @@ void CSettings::Load()
}
// name
pClient->strName = GetIniSetting ( IniXMLDocument, "client", "name" );
pClient->ChannelInfo.strName =
GetIniSetting ( IniXMLDocument, "client", "name" );
// instrument
if ( GetNumericIniSet ( IniXMLDocument, "client", "instrument",
0, CInstPictures::GetNumAvailableInst() - 1, iValue ) )
{
pClient->ChannelInfo.iInstrument = iValue;
}
// audio fader
if ( GetNumericIniSet ( IniXMLDocument, "client", "audfad",
@ -268,7 +276,11 @@ void CSettings::Save()
// name
PutIniSetting ( IniXMLDocument, "client", "name",
pClient->strName );
pClient->ChannelInfo.strName );
// instrument
SetNumericIniSet ( IniXMLDocument, "client", "instrument",
pClient->ChannelInfo.iInstrument );
// audio fader
SetNumericIniSet ( IniXMLDocument, "client", "audfad",