support Mute button for own audio #75

This commit is contained in:
Volker Fischer 2020-04-16 17:54:45 +02:00
parent ce647535d8
commit ad3e4e0587
5 changed files with 54 additions and 54 deletions

View file

@ -56,7 +56,7 @@ CClient::CClient ( const quint16 iPortNumber,
eAudioChannelConf ( CC_MONO ), eAudioChannelConf ( CC_MONO ),
iNumAudioChannels ( 1 ), iNumAudioChannels ( 1 ),
bIsInitializationPhase ( true ), bIsInitializationPhase ( true ),
bMuteInputAndOutput ( false ), bMuteOutStream ( false ),
Socket ( &Channel, iPortNumber ), Socket ( &Channel, iPortNumber ),
Sound ( AudioCallback, this, iCtrlMIDIChannel, bNoAutoJackConnect ), Sound ( AudioCallback, this, iCtrlMIDIChannel, bNoAutoJackConnect ),
iAudioInFader ( AUD_FADER_IN_MIDDLE ), iAudioInFader ( AUD_FADER_IN_MIDDLE ),
@ -807,6 +807,8 @@ void CClient::Init()
iStereoBlockSizeSam = 2 * iMonoBlockSizeSam; iStereoBlockSizeSam = 2 * iMonoBlockSizeSam;
vecCeltData.Init ( iCeltNumCodedBytes ); vecCeltData.Init ( iCeltNumCodedBytes );
vecZeros.Init ( iStereoBlockSizeSam, 0 );
vecsStereoSndCrdTMP.Init ( iStereoBlockSizeSam );
opus_custom_encoder_ctl ( CurOpusEncoder, opus_custom_encoder_ctl ( CurOpusEncoder,
OPUS_SET_BITRATE ( OPUS_SET_BITRATE (
@ -841,13 +843,11 @@ void CClient::Init()
// the output conversion buffer must be filled with the inner // the output conversion buffer must be filled with the inner
// block size for initialization (this is the latency which is // block size for initialization (this is the latency which is
// introduced by the conversion buffer) to avoid buffer underruns // introduced by the conversion buffer) to avoid buffer underruns
const CVector<int16_t> vZeros ( iStereoBlockSizeSam, 0 ); SndCrdConversionBufferOut.Put ( vecZeros, iStereoBlockSizeSam );
SndCrdConversionBufferOut.Put ( vZeros, vZeros.Size() );
} }
// reset initialization phase flag and mute flag // reset initialization phase flag and mute flag
bIsInitializationPhase = true; bIsInitializationPhase = true;
bMuteInputAndOutput = false;
} }
void CClient::AudioCallback ( CVector<int16_t>& psData, void* arg ) void CClient::AudioCallback ( CVector<int16_t>& psData, void* arg )
@ -868,12 +868,6 @@ static CTimingMeas JitterMeas ( 1000, "test2.dat" );
JitterMeas.Measure(); JitterMeas.Measure();
*/ */
// mute input if requested
if ( bMuteInputAndOutput )
{
vecsStereoSndCrd.Reset ( 0 );
}
// check if a conversion buffer is required or not // check if a conversion buffer is required or not
if ( bSndCrdConversionBufferRequired ) if ( bSndCrdConversionBufferRequired )
{ {
@ -901,12 +895,6 @@ JitterMeas.Measure();
// process audio data // process audio data
ProcessAudioDataIntern ( vecsStereoSndCrd ); ProcessAudioDataIntern ( vecsStereoSndCrd );
} }
// mute output if requested
if ( bMuteInputAndOutput )
{
vecsStereoSndCrd.Reset ( 0 );
}
} }
void CClient::ProcessAudioDataIntern ( CVector<int16_t>& vecsStereoSndCrd ) void CClient::ProcessAudioDataIntern ( CVector<int16_t>& vecsStereoSndCrd )
@ -1057,6 +1045,16 @@ void CClient::ProcessAudioDataIntern ( CVector<int16_t>& vecsStereoSndCrd )
{ {
// OPUS encoding // OPUS encoding
if ( CurOpusEncoder != nullptr ) if ( CurOpusEncoder != nullptr )
{
if ( bMuteOutStream )
{
opus_custom_encode ( CurOpusEncoder,
&vecZeros[i * iNumAudioChannels * iOPUSFrameSizeSamples],
iOPUSFrameSizeSamples,
&vecCeltData[0],
iCeltNumCodedBytes );
}
else
{ {
opus_custom_encode ( CurOpusEncoder, opus_custom_encode ( CurOpusEncoder,
&vecsStereoSndCrd[i * iNumAudioChannels * iOPUSFrameSizeSamples], &vecsStereoSndCrd[i * iNumAudioChannels * iOPUSFrameSizeSamples],
@ -1064,6 +1062,7 @@ void CClient::ProcessAudioDataIntern ( CVector<int16_t>& vecsStereoSndCrd )
&vecCeltData[0], &vecCeltData[0],
iCeltNumCodedBytes ); iCeltNumCodedBytes );
} }
}
// send coded audio through the network // send coded audio through the network
Channel.PrepAndSendPacket ( &Socket, Channel.PrepAndSendPacket ( &Socket,
@ -1073,6 +1072,12 @@ void CClient::ProcessAudioDataIntern ( CVector<int16_t>& vecsStereoSndCrd )
// Receive signal ---------------------------------------------------------- // Receive signal ----------------------------------------------------------
// in case of mute stream, store local data
if ( bMuteOutStream )
{
vecsStereoSndCrdTMP = vecsStereoSndCrd;
}
for ( i = 0; i < iSndCrdFrameSizeFactor; i++ ) for ( i = 0; i < iSndCrdFrameSizeFactor; i++ )
{ {
// receive a new block // receive a new block
@ -1120,6 +1125,16 @@ for (i = 0; i < iMonoBlockSizeSam; i++)
fflush(pFileDelay); fflush(pFileDelay);
*/ */
// for muted stream we have to add our local data here
if ( bMuteOutStream )
{
for ( i = 0; i < iStereoBlockSizeSam; i++ )
{
vecsStereoSndCrd[i] += vecsStereoSndCrdTMP[i];
}
}
// check if channel is connected and if we do not have the initialization phase // check if channel is connected and if we do not have the initialization phase
if ( Channel.IsConnected() && ( !bIsInitializationPhase ) ) if ( Channel.IsConnected() && ( !bIsInitializationPhase ) )
{ {

View file

@ -236,7 +236,7 @@ public:
bool GetFraSiFactDefSupported() { return bFraSiFactDefSupported; } bool GetFraSiFactDefSupported() { return bFraSiFactDefSupported; }
bool GetFraSiFactSafeSupported() { return bFraSiFactSafeSupported; } bool GetFraSiFactSafeSupported() { return bFraSiFactSafeSupported; }
void SetMuteInputAndOutputState ( const bool bDoMute ) { bMuteInputAndOutput = bDoMute; } void SetMuteOutStream ( const bool bDoMute ) { bMuteOutStream = bDoMute; }
void SetRemoteChanGain ( const int iId, const double dGain ) void SetRemoteChanGain ( const int iId, const double dGain )
{ Channel.SetRemoteChanGain ( iId, dGain ); } { Channel.SetRemoteChanGain ( iId, dGain ); }
@ -331,7 +331,7 @@ protected:
EAudChanConf eAudioChannelConf; EAudChanConf eAudioChannelConf;
int iNumAudioChannels; int iNumAudioChannels;
bool bIsInitializationPhase; bool bIsInitializationPhase;
bool bMuteInputAndOutput; bool bMuteOutStream;
CVector<unsigned char> vecCeltData; CVector<unsigned char> vecCeltData;
CHighPrioSocket Socket; CHighPrioSocket Socket;
@ -354,6 +354,8 @@ protected:
CBufferBase<int16_t> SndCrdConversionBufferIn; CBufferBase<int16_t> SndCrdConversionBufferIn;
CBufferBase<int16_t> SndCrdConversionBufferOut; CBufferBase<int16_t> SndCrdConversionBufferOut;
CVector<int16_t> vecDataConvBuf; CVector<int16_t> vecDataConvBuf;
CVector<int16_t> vecsStereoSndCrdTMP;
CVector<int16_t> vecZeros;
bool bFraSiFactPrefSupported; bool bFraSiFactPrefSupported;
bool bFraSiFactDefSupported; bool bFraSiFactDefSupported;

View file

@ -416,8 +416,8 @@ CClientDlg::CClientDlg ( CClient* pNCliP,
QObject::connect ( chbChat, SIGNAL ( stateChanged ( int ) ), QObject::connect ( chbChat, SIGNAL ( stateChanged ( int ) ),
this, SLOT ( OnChatStateChanged ( int ) ) ); this, SLOT ( OnChatStateChanged ( int ) ) );
QObject::connect ( chbProfile, SIGNAL ( stateChanged ( int ) ), QObject::connect ( chbLocalMute, SIGNAL ( stateChanged ( int ) ),
this, SLOT ( OnProfileStateChanged ( int ) ) ); this, SLOT ( OnLocalMuteStateChanged ( int ) ) );
// timers // timers
QObject::connect ( &TimerSigMet, SIGNAL ( timeout() ), QObject::connect ( &TimerSigMet, SIGNAL ( timeout() ),
@ -769,8 +769,8 @@ void CClientDlg::OnLicenceRequired ( ELicenceType eLicenceType )
{ {
CLicenceDlg LicenceDlg; CLicenceDlg LicenceDlg;
// mute the client // mute the client output stream
pClient->SetMuteInputAndOutputState ( true ); pClient->SetMuteOutStream ( true );
// Open the licence dialog and check if the licence was accepted. In // Open the licence dialog and check if the licence was accepted. In
// case the dialog is just closed or the decline button was pressed, // case the dialog is just closed or the decline button was pressed,
@ -780,8 +780,11 @@ void CClientDlg::OnLicenceRequired ( ELicenceType eLicenceType )
Disconnect(); Disconnect();
} }
// unmute the client // unmute the client output stream if local mute button is not pressed
pClient->SetMuteInputAndOutputState ( false ); if ( chbLocalMute->checkState() == Qt::Unchecked )
{
pClient->SetMuteOutStream ( false );
}
} }
} }
@ -923,16 +926,9 @@ void CClientDlg::OnChatStateChanged ( int value )
} }
} }
void CClientDlg::OnProfileStateChanged ( int value ) void CClientDlg::OnLocalMuteStateChanged ( int value )
{ {
if ( value == Qt::Checked ) pClient->SetMuteOutStream ( value == Qt::Checked );
{
ShowMusicianProfileDialog();
}
else
{
MusicianProfileDlg.hide();
}
} }
void CClientDlg::OnTimerSigMet() void CClientDlg::OnTimerSigMet()
@ -1166,19 +1162,6 @@ void CClientDlg::UpdateDisplay()
chbChat->setChecked ( true ); chbChat->setChecked ( true );
chbChat->blockSignals ( false ); chbChat->blockSignals ( false );
} }
if ( chbProfile->isChecked() && !MusicianProfileDlg.isVisible() )
{
chbProfile->blockSignals ( true );
chbProfile->setChecked ( false );
chbProfile->blockSignals ( false );
}
if ( !chbProfile->isChecked() && MusicianProfileDlg.isVisible() )
{
chbProfile->blockSignals ( true );
chbProfile->setChecked ( true );
chbProfile->blockSignals ( false );
}
} }
void CClientDlg::SetGUIDesign ( const EGUIDesign eNewDesign ) void CClientDlg::SetGUIDesign ( const EGUIDesign eNewDesign )

View file

@ -150,7 +150,7 @@ public slots:
void OnSettingsStateChanged ( int value ); void OnSettingsStateChanged ( int value );
void OnChatStateChanged ( int value ); void OnChatStateChanged ( int value );
void OnProfileStateChanged ( int value ); void OnLocalMuteStateChanged ( int value );
void OnAudioPanValueChanged ( int value ); void OnAudioPanValueChanged ( int value );

View file

@ -339,9 +339,9 @@
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QCheckBox" name="chbProfile"> <widget class="QCheckBox" name="chbLocalMute">
<property name="text"> <property name="text">
<string>My Profile</string> <string>Mute Stream</string>
</property> </property>
</widget> </widget>
</item> </item>