2006-12-18 15:39:33 +01:00
|
|
|
/******************************************************************************\
|
2009-02-22 12:07:18 +01:00
|
|
|
* Copyright (c) 2004-2009
|
2006-12-18 15:39:33 +01:00
|
|
|
*
|
|
|
|
* Author(s):
|
2009-05-01 12:25:32 +02:00
|
|
|
* Volker Fischer
|
2006-12-18 15:39:33 +01:00
|
|
|
*
|
|
|
|
******************************************************************************
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or modify it under
|
|
|
|
* the terms of the GNU General Public License as published by the Free Software
|
|
|
|
* Foundation; either version 2 of the License, or (at your option) any later
|
|
|
|
* version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
|
|
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|
|
|
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
|
|
|
|
* details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License along with
|
|
|
|
* this program; if not, write to the Free Software Foundation, Inc.,
|
|
|
|
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
|
|
*
|
|
|
|
\******************************************************************************/
|
|
|
|
|
|
|
|
#include "audiomixerboard.h"
|
|
|
|
|
|
|
|
|
2009-05-08 23:14:33 +02:00
|
|
|
/******************************************************************************\
|
|
|
|
* CChanneFader *
|
|
|
|
\******************************************************************************/
|
2006-12-09 16:00:24 +01:00
|
|
|
CChannelFader::CChannelFader ( QWidget* pNW,
|
2009-05-08 05:54:12 +02:00
|
|
|
QHBoxLayout* pParentLayout )
|
2006-12-09 16:00:24 +01:00
|
|
|
{
|
|
|
|
// create new GUI control objects and store pointers to them
|
2009-05-08 05:54:12 +02:00
|
|
|
pMainGrid = new QVBoxLayout();
|
|
|
|
pFader = new QSlider ( Qt::Vertical, pNW );
|
|
|
|
pcbMute = new QCheckBox ( "Mute", pNW );
|
|
|
|
pcbSolo = new QCheckBox ( "Solo", pNW );
|
|
|
|
pLabel = new QLabel ( "", pNW );
|
|
|
|
|
|
|
|
// setup layout
|
|
|
|
pMainGrid->setSpacing ( 2 );
|
2006-12-09 16:00:24 +01:00
|
|
|
|
|
|
|
// setup slider
|
|
|
|
pFader->setPageStep ( 1 );
|
2008-01-14 23:14:17 +01:00
|
|
|
pFader->setTickPosition ( QSlider::TicksBothSides );
|
2006-12-09 16:00:24 +01:00
|
|
|
pFader->setRange ( 0, AUD_MIX_FADER_MAX );
|
|
|
|
pFader->setTickInterval ( AUD_MIX_FADER_MAX / 9 );
|
|
|
|
|
2009-05-08 06:34:06 +02:00
|
|
|
// setup fader tag label (use white background of label)
|
|
|
|
QPalette newPalette = pLabel->palette();
|
|
|
|
newPalette.setColor ( QPalette::Active, QPalette::Window,
|
|
|
|
newPalette.color ( QPalette::Active, QPalette::Base ) );
|
2009-05-08 23:14:33 +02:00
|
|
|
newPalette.setColor ( QPalette::Disabled, QPalette::Window,
|
|
|
|
newPalette.color ( QPalette::Disabled, QPalette::Base ) );
|
|
|
|
newPalette.setColor ( QPalette::Inactive, QPalette::Window,
|
|
|
|
newPalette.color ( QPalette::Inactive, QPalette::Base ) );
|
2009-05-08 06:34:06 +02:00
|
|
|
|
|
|
|
pLabel->setPalette ( newPalette );
|
|
|
|
pLabel->setAutoFillBackground ( true );
|
2009-05-08 23:14:33 +02:00
|
|
|
pLabel->setFrameShape ( QFrame::Box );
|
2009-05-08 06:34:06 +02:00
|
|
|
|
2009-05-08 05:54:12 +02:00
|
|
|
// add user controls to grid
|
|
|
|
pMainGrid->addWidget( pFader, 0, Qt::AlignHCenter );
|
2009-05-09 10:22:09 +02:00
|
|
|
pMainGrid->addWidget( pcbMute, 0, Qt::AlignLeft );
|
|
|
|
pMainGrid->addWidget( pcbSolo, 0, Qt::AlignLeft );
|
2009-05-08 05:54:12 +02:00
|
|
|
pMainGrid->addWidget( pLabel, 0, Qt::AlignHCenter );
|
2006-12-09 16:00:24 +01:00
|
|
|
|
2009-05-08 05:54:12 +02:00
|
|
|
// add fader layout to audio mixer board layout
|
|
|
|
pParentLayout->addLayout ( pMainGrid );
|
|
|
|
|
|
|
|
// reset current fader
|
|
|
|
Reset();
|
2006-12-09 19:37:40 +01:00
|
|
|
|
2006-12-18 12:06:38 +01:00
|
|
|
// add help text to controls
|
2009-05-08 05:54:12 +02:00
|
|
|
pFader->setWhatsThis ( "<b>Mixer Fader:</b> Adjusts the audio level of "
|
|
|
|
"this channel. All connected clients at the server will be assigned "
|
|
|
|
"an audio fader at each client." );
|
|
|
|
|
|
|
|
pcbMute->setWhatsThis ( "<b>Mute:</b> Mutes the current channel." );
|
2006-12-18 12:06:38 +01:00
|
|
|
|
2009-05-08 05:54:12 +02:00
|
|
|
pcbSolo->setWhatsThis ( "<b>Solo:</b> If Solo checkbox is checked, only "
|
|
|
|
"the current channel is active and all other channels are muted. Only "
|
|
|
|
"one channel at a time can be set to solo." );
|
|
|
|
|
|
|
|
pLabel->setWhatsThis ( "<b>Mixer Fader Label:</b> Label (fader tag) "
|
|
|
|
"identifying the connected client. The tag name can be set in the "
|
|
|
|
"clients main window." );
|
2006-12-18 12:06:38 +01:00
|
|
|
|
2006-12-09 19:37:40 +01:00
|
|
|
|
|
|
|
// connections -------------------------------------------------------------
|
|
|
|
QObject::connect ( pFader, SIGNAL ( valueChanged ( int ) ),
|
2009-05-08 23:14:33 +02:00
|
|
|
this, SLOT ( OnGainValueChanged ( int ) ) );
|
2009-05-08 05:54:12 +02:00
|
|
|
|
|
|
|
QObject::connect ( pcbMute, SIGNAL ( stateChanged ( int ) ),
|
|
|
|
this, SLOT ( OnMuteStateChanged ( int ) ) );
|
2009-05-08 23:14:33 +02:00
|
|
|
|
|
|
|
QObject::connect ( pcbSolo, SIGNAL ( stateChanged ( int ) ),
|
|
|
|
this, SIGNAL ( soloStateChanged ( int ) ) );
|
2006-12-09 19:37:40 +01:00
|
|
|
}
|
|
|
|
|
2009-05-08 05:54:12 +02:00
|
|
|
void CChannelFader::Reset()
|
2006-12-09 19:37:40 +01:00
|
|
|
{
|
2009-05-08 05:54:12 +02:00
|
|
|
// init gain value -> maximum value as definition according to server
|
|
|
|
pFader->setValue ( AUD_MIX_FADER_MAX );
|
|
|
|
|
|
|
|
// reset mute/solo check boxes
|
|
|
|
pcbMute->setChecked ( false );
|
|
|
|
pcbSolo->setChecked ( false );
|
|
|
|
|
|
|
|
// clear label
|
|
|
|
pLabel->setText ( "" );
|
2009-05-08 23:14:33 +02:00
|
|
|
|
|
|
|
bOtherChannelIsSolo = false;
|
2009-05-08 05:54:12 +02:00
|
|
|
}
|
2006-12-09 19:37:40 +01:00
|
|
|
|
2009-05-08 23:14:33 +02:00
|
|
|
void CChannelFader::OnGainValueChanged ( int value )
|
2009-05-08 05:54:12 +02:00
|
|
|
{
|
|
|
|
// if mute flag is set, do not apply the new fader value
|
|
|
|
if ( pcbMute->checkState() == Qt::Unchecked )
|
|
|
|
{
|
|
|
|
// emit signal for new fader gain value
|
2009-05-08 23:14:33 +02:00
|
|
|
emit gainValueChanged ( CalcFaderGain ( value ) );
|
2009-05-08 05:54:12 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void CChannelFader::OnMuteStateChanged ( int value )
|
|
|
|
{
|
2009-05-08 23:14:33 +02:00
|
|
|
// call muting function
|
|
|
|
SetMute ( static_cast<Qt::CheckState> ( value ) == Qt::Checked );
|
|
|
|
}
|
|
|
|
|
|
|
|
void CChannelFader::SetMute ( const bool bState )
|
|
|
|
{
|
|
|
|
if ( bState )
|
2009-05-08 05:54:12 +02:00
|
|
|
{
|
|
|
|
// mute channel -> send gain of 0
|
2009-05-08 23:14:33 +02:00
|
|
|
emit gainValueChanged ( 0 );
|
2009-05-08 05:54:12 +02:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2009-05-08 23:14:33 +02:00
|
|
|
// only unmute if no other channel is on solo
|
|
|
|
if ( !bOtherChannelIsSolo )
|
|
|
|
{
|
|
|
|
// mute was unchecked, get current fader value and apply
|
|
|
|
emit gainValueChanged ( CalcFaderGain ( pFader->value() ) );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void CChannelFader::ResetSoloState()
|
|
|
|
{
|
|
|
|
// reset solo state -> since solo state means that this channel is not
|
|
|
|
// muted but all others, we simply have to uncheck the check box
|
|
|
|
pcbSolo->setChecked ( false );
|
|
|
|
}
|
|
|
|
|
|
|
|
void CChannelFader::SetOtherSoloState ( const bool bState )
|
|
|
|
{
|
|
|
|
// store state (must be done before the SetMute() call!)
|
|
|
|
bOtherChannelIsSolo = bState;
|
|
|
|
|
|
|
|
// check if we are in solo on state, in that case we first have to disable
|
|
|
|
// our solo state since only one channel can be set to solo
|
|
|
|
if ( bState && pcbSolo->isChecked() )
|
|
|
|
{
|
|
|
|
pcbSolo->setChecked ( false );
|
|
|
|
}
|
|
|
|
|
|
|
|
// if other channel is solo, mute this channel, else enable channel gain
|
|
|
|
// (only enable channel gain if local mute switch is not set to on)
|
|
|
|
if ( !pcbMute->isChecked() )
|
|
|
|
{
|
|
|
|
SetMute ( bState );
|
2009-05-08 05:54:12 +02:00
|
|
|
}
|
2006-12-09 16:00:24 +01:00
|
|
|
}
|
|
|
|
|
2008-01-22 22:15:04 +01:00
|
|
|
void CChannelFader::SetText ( const QString sText )
|
2006-12-09 16:00:24 +01:00
|
|
|
{
|
2006-12-10 13:36:43 +01:00
|
|
|
const int iBreakPos = 7;
|
2006-12-09 16:00:24 +01:00
|
|
|
|
2009-05-08 06:34:06 +02:00
|
|
|
// make sure we insert an HTML space (" ") at each beginning and end
|
|
|
|
// of line for nicer look
|
|
|
|
|
2006-12-10 13:36:43 +01:00
|
|
|
// break text at predefined position, if text is too short, break anyway to
|
|
|
|
// make sure we have two lines for fader tag
|
2008-01-22 22:15:04 +01:00
|
|
|
QString sModText = sText;
|
2006-12-09 16:00:24 +01:00
|
|
|
|
|
|
|
if ( sModText.length() > iBreakPos )
|
|
|
|
{
|
2009-05-08 06:34:06 +02:00
|
|
|
sModText.insert ( iBreakPos, QString ( " <br> " ) );
|
2006-12-09 16:00:24 +01:00
|
|
|
}
|
2006-12-10 13:36:43 +01:00
|
|
|
else
|
|
|
|
{
|
2009-05-08 05:54:12 +02:00
|
|
|
// insert line break at the beginning of the string -> make sure
|
|
|
|
// if we only have one line that the text appears at the bottom line
|
2009-05-08 06:34:06 +02:00
|
|
|
sModText.insert ( 0, QString ( " <br> " ) );
|
2006-12-10 13:36:43 +01:00
|
|
|
}
|
2006-12-09 16:00:24 +01:00
|
|
|
|
2009-05-08 06:34:06 +02:00
|
|
|
// use bold centered text
|
|
|
|
sModText.prepend ( "<center><b> " );
|
|
|
|
sModText.append ( " </b></center>" );
|
2006-12-09 16:00:24 +01:00
|
|
|
|
|
|
|
pLabel->setText ( sModText );
|
|
|
|
}
|
2006-12-18 15:39:33 +01:00
|
|
|
|
2009-05-08 05:54:12 +02:00
|
|
|
double CChannelFader::CalcFaderGain ( const int value )
|
|
|
|
{
|
|
|
|
// convert actual slider range in gain values
|
|
|
|
// and normalize so that maximum gain is 1
|
|
|
|
return static_cast<double> ( value ) / AUD_MIX_FADER_MAX;
|
|
|
|
}
|
|
|
|
|
2009-05-08 23:14:33 +02:00
|
|
|
|
|
|
|
/******************************************************************************\
|
|
|
|
* CAudioMixerBoard *
|
|
|
|
\******************************************************************************/
|
2009-05-08 06:34:06 +02:00
|
|
|
CAudioMixerBoard::CAudioMixerBoard ( QWidget* parent, Qt::WindowFlags f ) :
|
|
|
|
QGroupBox ( parent )
|
2006-12-09 16:00:24 +01:00
|
|
|
{
|
2009-05-08 06:34:06 +02:00
|
|
|
// set title text and title properties
|
2009-05-09 11:26:27 +02:00
|
|
|
setTitle ( "Server" );
|
2006-12-09 16:00:24 +01:00
|
|
|
|
2009-05-08 06:34:06 +02:00
|
|
|
// add hboxlayout
|
2009-05-01 16:00:53 +02:00
|
|
|
pMainLayout = new QHBoxLayout ( this );
|
2008-01-14 23:14:17 +01:00
|
|
|
|
2006-12-09 16:00:24 +01:00
|
|
|
// create all mixer controls and make them invisible
|
|
|
|
vecpChanFader.Init ( MAX_NUM_CHANNELS );
|
|
|
|
for ( int i = 0; i < MAX_NUM_CHANNELS; i++ )
|
|
|
|
{
|
2009-05-08 05:54:12 +02:00
|
|
|
vecpChanFader[i] = new CChannelFader ( this, pMainLayout );
|
2006-12-09 16:00:24 +01:00
|
|
|
vecpChanFader[i]->Hide();
|
|
|
|
}
|
|
|
|
|
2009-05-08 23:14:33 +02:00
|
|
|
// insert horizontal spacer
|
|
|
|
pMainLayout->addItem ( new QSpacerItem ( 0, 0, QSizePolicy::Expanding ) );
|
|
|
|
|
2006-12-09 16:00:24 +01:00
|
|
|
|
2006-12-09 19:37:40 +01:00
|
|
|
// connections -------------------------------------------------------------
|
|
|
|
// CODE TAG: MAX_NUM_CHANNELS_TAG
|
|
|
|
// make sure we have MAX_NUM_CHANNELS connections!!!
|
2009-05-08 23:14:33 +02:00
|
|
|
QObject::connect ( vecpChanFader[0], SIGNAL ( gainValueChanged ( double ) ), this, SLOT ( OnGainValueChangedCh0 ( double ) ) );
|
|
|
|
QObject::connect ( vecpChanFader[1], SIGNAL ( gainValueChanged ( double ) ), this, SLOT ( OnGainValueChangedCh1 ( double ) ) );
|
|
|
|
QObject::connect ( vecpChanFader[2], SIGNAL ( gainValueChanged ( double ) ), this, SLOT ( OnGainValueChangedCh2 ( double ) ) );
|
|
|
|
QObject::connect ( vecpChanFader[3], SIGNAL ( gainValueChanged ( double ) ), this, SLOT ( OnGainValueChangedCh3 ( double ) ) );
|
|
|
|
QObject::connect ( vecpChanFader[4], SIGNAL ( gainValueChanged ( double ) ), this, SLOT ( OnGainValueChangedCh4 ( double ) ) );
|
|
|
|
QObject::connect ( vecpChanFader[5], SIGNAL ( gainValueChanged ( double ) ), this, SLOT ( OnGainValueChangedCh5 ( double ) ) );
|
|
|
|
QObject::connect ( vecpChanFader[6], SIGNAL ( gainValueChanged ( double ) ), this, SLOT ( OnGainValueChangedCh6 ( double ) ) );
|
|
|
|
QObject::connect ( vecpChanFader[7], SIGNAL ( gainValueChanged ( double ) ), this, SLOT ( OnGainValueChangedCh7 ( double ) ) );
|
|
|
|
QObject::connect ( vecpChanFader[8], SIGNAL ( gainValueChanged ( double ) ), this, SLOT ( OnGainValueChangedCh8 ( double ) ) );
|
|
|
|
QObject::connect ( vecpChanFader[9], SIGNAL ( gainValueChanged ( double ) ), this, SLOT ( OnGainValueChangedCh9 ( double ) ) );
|
|
|
|
|
|
|
|
QObject::connect ( vecpChanFader[0], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChangedCh0 ( int ) ) );
|
|
|
|
QObject::connect ( vecpChanFader[1], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChangedCh1 ( int ) ) );
|
|
|
|
QObject::connect ( vecpChanFader[2], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChangedCh2 ( int ) ) );
|
|
|
|
QObject::connect ( vecpChanFader[3], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChangedCh3 ( int ) ) );
|
|
|
|
QObject::connect ( vecpChanFader[4], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChangedCh4 ( int ) ) );
|
|
|
|
QObject::connect ( vecpChanFader[5], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChangedCh5 ( int ) ) );
|
|
|
|
QObject::connect ( vecpChanFader[6], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChangedCh6 ( int ) ) );
|
|
|
|
QObject::connect ( vecpChanFader[7], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChangedCh7 ( int ) ) );
|
|
|
|
QObject::connect ( vecpChanFader[8], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChangedCh8 ( int ) ) );
|
|
|
|
QObject::connect ( vecpChanFader[9], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChangedCh9 ( int ) ) );
|
2006-12-09 16:00:24 +01:00
|
|
|
}
|
|
|
|
|
2006-12-09 19:37:40 +01:00
|
|
|
void CAudioMixerBoard::HideAll()
|
2006-12-09 16:00:24 +01:00
|
|
|
{
|
|
|
|
// make old controls invisible
|
2009-03-01 12:17:35 +01:00
|
|
|
for ( int i = 0; i < USED_NUM_CHANNELS; i++ )
|
2006-12-09 16:00:24 +01:00
|
|
|
{
|
|
|
|
vecpChanFader[i]->Hide();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void CAudioMixerBoard::ApplyNewConClientList ( CVector<CChannelShortInfo>& vecChanInfo )
|
|
|
|
{
|
2006-12-09 19:37:40 +01:00
|
|
|
// search for channels with are already present and preserver their gain
|
|
|
|
// setting, for all other channels, reset gain
|
2009-03-01 12:17:35 +01:00
|
|
|
for ( int i = 0; i < USED_NUM_CHANNELS; i++ )
|
2006-12-09 19:37:40 +01:00
|
|
|
{
|
|
|
|
bool bFaderIsUsed = false;
|
|
|
|
|
|
|
|
for ( int j = 0; j < vecChanInfo.Size(); j++ )
|
|
|
|
{
|
2009-05-08 23:14:33 +02:00
|
|
|
// check if current fader is used
|
2006-12-09 19:37:40 +01:00
|
|
|
if ( vecChanInfo[j].iChanID == i )
|
|
|
|
{
|
|
|
|
// check if fader was already in use -> preserve gain value
|
|
|
|
if ( !vecpChanFader[i]->IsVisible() )
|
|
|
|
{
|
2009-05-08 05:54:12 +02:00
|
|
|
vecpChanFader[i]->Reset();
|
2006-12-09 19:37:40 +01:00
|
|
|
|
|
|
|
// show fader
|
|
|
|
vecpChanFader[i]->Show();
|
|
|
|
}
|
2009-05-08 23:14:33 +02:00
|
|
|
else
|
|
|
|
{
|
|
|
|
// by definition disable all Solo switches if the number of
|
|
|
|
// channels at the server has changed
|
|
|
|
vecpChanFader[i]->SetOtherSoloState ( false );
|
|
|
|
vecpChanFader[i]->ResetSoloState();
|
|
|
|
}
|
2006-12-09 19:37:40 +01:00
|
|
|
|
|
|
|
// update text
|
|
|
|
vecpChanFader[i]->SetText ( GenFaderText ( vecChanInfo[j] ) );
|
|
|
|
|
|
|
|
bFaderIsUsed = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// if current fader is not used, hide it
|
|
|
|
if ( !bFaderIsUsed )
|
|
|
|
{
|
|
|
|
vecpChanFader[i]->Hide();
|
|
|
|
}
|
|
|
|
}
|
2006-12-09 16:00:24 +01:00
|
|
|
}
|
|
|
|
|
2009-05-08 23:14:33 +02:00
|
|
|
void CAudioMixerBoard::OnChSoloStateChanged ( const int iChannelIdx, const int iValue )
|
|
|
|
{
|
|
|
|
// if channel iChannelIdx has just activated the solo switch, mute all
|
|
|
|
// other channels, else enable them again
|
|
|
|
const bool bSetOtherSoloState =
|
|
|
|
( static_cast<Qt::CheckState> ( iValue ) == Qt::Checked );
|
|
|
|
|
|
|
|
// apply "other solo state" for all other channels
|
|
|
|
for ( int i = 0; i < USED_NUM_CHANNELS; i++ )
|
|
|
|
{
|
|
|
|
if ( i != iChannelIdx )
|
|
|
|
{
|
|
|
|
// check if fader is in use
|
|
|
|
if ( vecpChanFader[i]->IsVisible() )
|
|
|
|
{
|
|
|
|
vecpChanFader[i]->SetOtherSoloState ( bSetOtherSoloState );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2008-01-22 22:15:04 +01:00
|
|
|
QString CAudioMixerBoard::GenFaderText ( CChannelShortInfo& ChanInfo )
|
2006-12-09 19:37:40 +01:00
|
|
|
{
|
|
|
|
// if text is empty, show IP address instead
|
2008-01-22 22:15:04 +01:00
|
|
|
if ( ChanInfo.strName.isEmpty() )
|
2006-12-09 19:37:40 +01:00
|
|
|
{
|
2009-03-10 23:08:12 +01:00
|
|
|
// convert IP address to text and show it (use dummy port number
|
|
|
|
// since it is not used here)
|
|
|
|
const CHostAddress TempAddr =
|
|
|
|
CHostAddress ( QHostAddress ( ChanInfo.iIpAddr ), 0 );
|
|
|
|
|
|
|
|
return TempAddr.GetIpAddressStringNoLastByte();
|
2006-12-09 19:37:40 +01:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
// show name of channel
|
|
|
|
return ChanInfo.strName;
|
|
|
|
}
|
2006-12-09 16:00:24 +01:00
|
|
|
}
|