diff --git a/src/audio/alsalayer.cpp b/src/audio/alsalayer.cpp index a6964f2a9f70aafad3bab0f07f65ba6c9e4d5cc6..5cfa87284110879a0e287729b3a606b82a29bdc9 100644 --- a/src/audio/alsalayer.cpp +++ b/src/audio/alsalayer.cpp @@ -28,8 +28,6 @@ int framesPerBufferAlsa = 2048; , _CaptureHandle(NULL) , _periodSize() , _audioPlugin() - , _inChannel() - , _outChannel() , IDSoundCards() , _is_prepared_playback (false) , _is_running_playback (false) @@ -88,8 +86,6 @@ AlsaLayer::openDevice (int indexIn, int indexOut, int sampleRate, int frameSize, _sampleRate = sampleRate; _frameSize = frameSize; _audioPlugin = plugin; - _inChannel = 1; - _outChannel = 1; _debugAlsa(" Setting AlsaLayer: device in=%2d, out=%2d\n", _indexIn, _indexOut); _debugAlsa(" : alsa plugin=%s\n", _audioPlugin.c_str()); @@ -152,9 +148,6 @@ AlsaLayer::getMic(void *buffer, int toCopy) return res ; } -void AlsaLayer::reducePulseAppsVolume( void ){} -void AlsaLayer::restorePulseAppsVolume( void ){} - ////////////////////////////////////////////////////////////////////////////////////////////// ///////////////// ALSA PRIVATE FUNCTIONS //////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////// diff --git a/src/audio/alsalayer.h b/src/audio/alsalayer.h index b64d1e66810879a14f235425fe165ce2b02bc706..a36d423a1add9306396a1d98d6784d3c5f6806ad 100644 --- a/src/audio/alsalayer.h +++ b/src/audio/alsalayer.h @@ -137,22 +137,6 @@ class AlsaLayer : public AudioLayer { */ std::string getAudioPlugin( void ) { return _audioPlugin; } - /** - * UNUSED in ALSA layer - */ - void reducePulseAppsVolume( void ); - - /** - * UNUSED in ALSA layer - */ - void restorePulseAppsVolume( void ); - - /** - * UNUSED in ALSA layer - */ - void setPlaybackVolume( UNUSED int volume ){} - void setCaptureVolume( UNUSED int volume ){} - void audioCallback (void); private: @@ -270,18 +254,6 @@ class AlsaLayer : public AudioLayer { */ std::string _audioPlugin; - /** - * Input channel (mic) should be 1 mono - */ - unsigned int _inChannel; - - /** - * Output channel (stereo) should be 1 mono - */ - unsigned int _outChannel; - - - /** Vector to manage all soundcard index - description association of the system */ std::vector<HwIDPair> IDSoundCards; diff --git a/src/audio/audiolayer.h b/src/audio/audiolayer.h index 91aaafe78a2a584fd927b8030447dec25e501f36..35e7e92d7ed4e190b3c5af62510b59e1d77f824e 100644 --- a/src/audio/audiolayer.h +++ b/src/audio/audiolayer.h @@ -59,7 +59,6 @@ class AudioLayer { , _urgentRingBuffer( SIZEBUF) , _micRingBuffer( SIZEBUF ) , _defaultVolume(100) - , _talk ( false ) , _indexIn ( 0 ) , _indexOut ( 0 ) , _sampleRate ( 0 ) @@ -72,7 +71,6 @@ class AudioLayer { } - /** * Destructor */ @@ -123,47 +121,6 @@ class AudioLayer { */ virtual int getMic(void * buffer, int toCopy) = 0; - /** - * Scan the sound card available on the system - * @param stream To indicate whether we are looking for capture devices or playback devices - * SFL_PCM_CAPTURE - * SFL_PCM_PLAYBACK - * SFL_PCM_BOTH - * @return std::vector<std::string> The vector containing the string description of the card - */ - virtual std::vector<std::string> getSoundCardsInfo( int stream ) = 0; - - /** - * Check if the given index corresponds to an existing sound card and supports the specified streaming mode - * @param card An index - * @param stream The stream mode - * SFL_PCM_CAPTURE - * SFL_PCM_PLAYBACK - * SFL_PCM_BOTH - * @return bool True if it exists and supports the mode - * false otherwise - */ - virtual bool soundCardIndexExist( int card , int stream ) = 0; - - /** - * An index is associated with its string description - * @param description The string description - * @return int Its index - */ - virtual int soundCardGetIndex( std::string description ) = 0; - - /** - * Get the current audio plugin. - * @return std::string The name of the audio plugin - */ - virtual std::string getAudioPlugin( void ) = 0; - - virtual void reducePulseAppsVolume( void ) = 0; - virtual void restorePulseAppsVolume( void ) = 0; - - virtual void setPlaybackVolume( int volume ) = 0; - virtual void setCaptureVolume( int volume ) = 0; - /** * Send a chunk of data to the hardware buffer to start the playback * Copy data in the urgent buffer. @@ -233,13 +190,6 @@ class AudioLayer { */ unsigned int getFrameSize() { return _frameSize; } - /** - * Get the current state. Conversation or not - * @return bool true if playSamples has been called - * false otherwise - */ - bool getCurrentState( void ) { return _talk; } - int getLayerType( void ) { return _layerType; } /** @@ -271,13 +221,6 @@ class AudioLayer { RingBuffer _voiceRingBuffer; RingBuffer _micRingBuffer; - /** - * Determine if both endpoints hang up. - * true if conversation is running - * false otherwise - */ - bool _talk; - /** * Number of audio cards on which capture stream has been opened */ diff --git a/src/audio/pulselayer.h b/src/audio/pulselayer.h index a1948652411aa9fd45c8c06653c74b339194b385..a4491476d11950f79b0cdc4ca9c765bb4004f198 100644 --- a/src/audio/pulselayer.h +++ b/src/audio/pulselayer.h @@ -79,26 +79,11 @@ class PulseLayer : public AudioLayer { /** * UNUSED in pulseaudio layer */ - std::vector<std::string> getSoundCardsInfo( int stream UNUSED ) { - std::vector<std::string> tmp; - return tmp; - } + //std::vector<std::string> getSoundCardsInfo( int stream UNUSED ) { + //std::vector<std::string> tmp; + //return tmp; + //} - /** - * UNUSED in pulseaudio layer - */ - bool soundCardIndexExist( int card UNUSED, int stream UNUSED ) { return true; } - - /** - * UNUSED in pulseaudio layer - */ - int soundCardGetIndex( std::string description UNUSED ) { return 0;} - - /** - * UNUSED in pulseaudio layer - */ - std::string getAudioPlugin( void ) { return "default"; } - /** * Reduce volume of every audio applications connected to the same sink */ diff --git a/src/managerimpl.cpp b/src/managerimpl.cpp index a69b8e659ba0669abc6401877bc0dd43d34b555d..e5292532c720e874939a541b2bc6c4ee436bc915 100644 --- a/src/managerimpl.cpp +++ b/src/managerimpl.cpp @@ -122,9 +122,8 @@ ManagerImpl::init() // Initialize the list of supported audio codecs initAudioCodec(); - getAudioInputDeviceList(); - AudioLayer *audiolayer = getAudioDriver(); + if (audiolayer!=0) { unsigned int sampleRate = audiolayer->getSampleRate(); @@ -250,29 +249,35 @@ ManagerImpl::answerCall(const CallID& id) bool ManagerImpl::hangupCall(const CallID& id) { - stopTone(true); + PulseLayer *pulselayer; + AccountID accountid; + bool returnValue; - if (_dbus) _dbus->getCallManager()->callStateChanged(id, "HUNGUP"); - - AccountID accountid = getAccountFromCall( id ); - if (accountid == AccountNULL) { - /** @todo We should tell the GUI that the call doesn't exist, so - * it clears up. This can happen. */ - _debug("! Manager Hangup Call: Call doesn't exists\n"); - return false; - } + stopTone(true); - bool returnValue = getAccountLink(accountid)->hangup(id); + /* Broadcast a signal over DBus */ + if (_dbus) _dbus->getCallManager()->callStateChanged(id, "HUNGUP"); + + accountid = getAccountFromCall( id ); + if (accountid == AccountNULL) { + /** @todo We should tell the GUI that the call doesn't exist, so + * it clears up. This can happen. */ + _debug("! Manager Hangup Call: Call doesn't exists\n"); + return false; + } - _debug("After voip link hungup!\n"); - removeCallAccount(id); - switchCall(""); + returnValue = getAccountLink(accountid)->hangup(id); - if( getConfigInt( PREFERENCES , CONFIG_PA_VOLUME_CTRL ) ) - _audiodriver->restorePulseAppsVolume(); + _debug("After voip link hungup!\n"); + removeCallAccount(id); + switchCall(""); - _debug("Before hungup return!\n"); - return returnValue; + if( _audiodriver->getLayerType() == PULSEAUDIO && getConfigInt( PREFERENCES , CONFIG_PA_VOLUME_CTRL ) ) { + pulselayer = dynamic_cast<PulseLayer *> (getAudioDriver()); + if(pulselayer) pulselayer->restorePulseAppsVolume(); + } + + return returnValue; } //THREAD=Main @@ -554,38 +559,44 @@ ManagerImpl::isWaitingCall(const CallID& id) { bool ManagerImpl::incomingCall(Call* call, const AccountID& accountId) { - _debug("Incoming call %s\n", call->getCallId().data()); + PulseLayer *pulselayer; + std::string from, number; - associateCallToAccount(call->getCallId(), accountId); + _debug("Incoming call %s\n", call->getCallId().data()); - if ( !hasCurrentCall() ) { - call->setConnectionState(Call::Ringing); - ringtone(); - switchCall(call->getCallId()); - } else { - addWaitingCall(call->getCallId()); - } + associateCallToAccount(call->getCallId(), accountId); + + if ( !hasCurrentCall() ) { + call->setConnectionState(Call::Ringing); + ringtone(); + switchCall(call->getCallId()); + } else { + addWaitingCall(call->getCallId()); + } - std::string from = call->getPeerName(); - std::string number = call->getPeerNumber(); + from = call->getPeerName(); + number = call->getPeerNumber(); - if (from != "" && number != "") { - from.append(" <"); - from.append(number); - from.append(">"); - } else if ( from.empty() ) { - from.append("<"); - from.append(number); - from.append(">"); - } + if (from != "" && number != "") { + from.append(" <"); + from.append(number); + from.append(">"); + } else if ( from.empty() ) { + from.append("<"); + from.append(number); + from.append(">"); + } - _dbus->getCallManager()->incomingCall(accountId, call->getCallId(), from); + /* Broadcast a signal over DBus */ + _dbus->getCallManager()->incomingCall(accountId, call->getCallId(), from); - // Reduce volume of the other pulseaudio-connected audio applications - if( getConfigInt( PREFERENCES , CONFIG_PA_VOLUME_CTRL ) ) - _audiodriver->reducePulseAppsVolume(); + // Reduce volume of the other pulseaudio-connected audio applications + if( _audiodriver->getLayerType() == PULSEAUDIO && getConfigInt( PREFERENCES , CONFIG_PA_VOLUME_CTRL ) ) { + pulselayer = dynamic_cast<PulseLayer *> (getAudioDriver()); + if(pulselayer) pulselayer->reducePulseAppsVolume(); + } - return true; + return true; } //THREAD=VoIP @@ -620,22 +631,30 @@ ManagerImpl::peerRingingCall(const CallID& id) void ManagerImpl::peerHungupCall(const CallID& id) { - AccountID accountid = getAccountFromCall( id ); - if (accountid == AccountNULL) { - _debug("peerHungupCall: Call doesn't exists\n"); - return; - } + PulseLayer *pulselayer; + AccountID accountid; + + accountid = getAccountFromCall( id ); + if (accountid == AccountNULL) { + _debug("peerHungupCall: Call doesn't exists\n"); + return; + } - if (_dbus) _dbus->getCallManager()->callStateChanged(id, "HUNGUP"); - if (isCurrentCall(id)) { - stopTone(true); - switchCall(""); - } - removeWaitingCall(id); - removeCallAccount(id); + /* Broadcast a signal over DBus */ + if (_dbus) _dbus->getCallManager()->callStateChanged(id, "HUNGUP"); + + if (isCurrentCall(id)) { + stopTone(true); + switchCall(""); + } + + removeWaitingCall(id); + removeCallAccount(id); - if( getConfigInt( PREFERENCES , CONFIG_PA_VOLUME_CTRL ) ) - _audiodriver->restorePulseAppsVolume(); + if( _audiodriver->getLayerType() == PULSEAUDIO && getConfigInt( PREFERENCES , CONFIG_PA_VOLUME_CTRL ) ) { + pulselayer = dynamic_cast<PulseLayer *> (getAudioDriver()); + if(pulselayer) pulselayer->restorePulseAppsVolume(); + } } //THREAD=VoIP @@ -1226,7 +1245,10 @@ ManagerImpl::setOutputAudioPlugin(const std::string& audioPlugin) ManagerImpl::getAudioOutputDeviceList(void) { _debug("Get audio output device list\n"); - return _audiodriver -> getSoundCardsInfo(SFL_PCM_PLAYBACK); + AlsaLayer *layer; + + layer = dynamic_cast<AlsaLayer*> (getAudioDriver ()); + if (layer) return layer -> getSoundCardsInfo(SFL_PCM_PLAYBACK); } /** @@ -1235,19 +1257,22 @@ ManagerImpl::getAudioOutputDeviceList(void) void ManagerImpl::setAudioOutputDevice(const int index) { - //int layer = _audiodriver -> getLayerType(); - _debug("Set audio output device: %i\n", index); - _audiodriver -> setErrorMessage( -1 ); - _audiodriver->openDevice(_audiodriver->getIndexIn(), - index, - _audiodriver->getSampleRate(), - _audiodriver->getFrameSize(), - SFL_PCM_PLAYBACK, - _audiodriver->getAudioPlugin()); - if( _audiodriver -> getErrorMessage() != -1) - notifyErrClient( _audiodriver -> getErrorMessage() ); - // set config - setConfig( AUDIO , ALSA_CARD_ID_OUT , index ); + AlsaLayer *alsalayer; + std::string alsaplugin; + _debug("Set audio output device: %i\n", index); + + _audiodriver -> setErrorMessage( -1 ); + + alsalayer = dynamic_cast<AlsaLayer*> (getAudioDriver ()); + alsaplugin = alsalayer->getAudioPlugin (); + + _audiodriver->openDevice(_audiodriver->getIndexIn(), index, _audiodriver->getSampleRate(), _audiodriver->getFrameSize(), SFL_PCM_PLAYBACK, alsaplugin ); + + if( _audiodriver -> getErrorMessage() != -1) + notifyErrClient( _audiodriver -> getErrorMessage() ); + + // set config + setConfig( AUDIO , ALSA_CARD_ID_OUT , index ); } /** @@ -1257,7 +1282,10 @@ ManagerImpl::setAudioOutputDevice(const int index) ManagerImpl::getAudioInputDeviceList(void) { _debug("Get audio input device list\n"); - return _audiodriver->getSoundCardsInfo(SFL_PCM_CAPTURE); + AlsaLayer *audiolayer; + + audiolayer = dynamic_cast<AlsaLayer *> ( getAudioDriver()); + if(audiolayer) return audiolayer->getSoundCardsInfo(SFL_PCM_CAPTURE); } /** @@ -1266,19 +1294,23 @@ ManagerImpl::getAudioInputDeviceList(void) void ManagerImpl::setAudioInputDevice(const int index) { - //int layer = _audiodriver -> getLayerType(); - _debug("Set audio input device %i\n", index); - _audiodriver -> setErrorMessage( -1 ); - _audiodriver->openDevice(index, - _audiodriver->getIndexOut(), - _audiodriver->getSampleRate(), - _audiodriver->getFrameSize(), - SFL_PCM_CAPTURE, - _audiodriver->getAudioPlugin()); - if( _audiodriver -> getErrorMessage() != -1) - notifyErrClient( _audiodriver -> getErrorMessage() ); - // set config - setConfig( AUDIO , ALSA_CARD_ID_IN , index ); + AlsaLayer *alsalayer; + std::string alsaplugin; + + _debug("Set audio input device %i\n", index); + + _audiodriver -> setErrorMessage( -1 ); + + alsalayer = dynamic_cast<AlsaLayer*> (getAudioDriver ()); + alsaplugin = alsalayer->getAudioPlugin (); + + _audiodriver->openDevice(index, _audiodriver->getIndexOut(), _audiodriver->getSampleRate(), _audiodriver->getFrameSize(), SFL_PCM_CAPTURE, alsaplugin ); + + if( _audiodriver -> getErrorMessage() != -1) + notifyErrClient( _audiodriver -> getErrorMessage() ); + + // set config + setConfig( AUDIO , ALSA_CARD_ID_IN , index ); } /** @@ -1523,16 +1555,23 @@ ManagerImpl::notifyErrClient( const int32_t& errCode ) int ManagerImpl::getAudioDeviceIndex(const std::string name) { - _debug("Get audio device index\n"); - int num = _audiodriver -> soundCardGetIndex( name ); - return num; + AlsaLayer *alsalayer; + + _debug("Get audio device index\n"); + + alsalayer = dynamic_cast<AlsaLayer *> (getAudioDriver()); + if(alsalayer) return alsalayer -> soundCardGetIndex( name ); } std::string ManagerImpl::getCurrentAudioOutputPlugin( void ) { - _debug("Get alsa plugin\n"); - return _audiodriver -> getAudioPlugin(); + AlsaLayer *alsalayer; + + _debug("Get alsa plugin\n"); + + alsalayer = dynamic_cast<AlsaLayer *> (getAudioDriver()); + if(alsalayer) return alsalayer -> getAudioPlugin (); } int ManagerImpl::app_is_running( std::string process ) @@ -1592,10 +1631,12 @@ ManagerImpl::selectAudioDriver (void) { int layer, numCardIn, numCardOut, sampleRate, frameSize; std::string alsaPlugin; + AlsaLayer *alsalayer; layer = _audiodriver->getLayerType(); _debug("Audio layer type: %i\n" , layer); + /* Retrieve the global devices info from the user config */ alsaPlugin = getConfigString( AUDIO , ALSA_PLUGIN ); numCardIn = getConfigInt( AUDIO , ALSA_CARD_ID_IN ); numCardOut = getConfigInt( AUDIO , ALSA_CARD_ID_OUT ); @@ -1605,17 +1646,22 @@ ManagerImpl::selectAudioDriver (void) } frameSize = getConfigInt( AUDIO , ALSA_FRAME_SIZE ); - if( !_audiodriver -> soundCardIndexExist( numCardIn , SFL_PCM_CAPTURE ) ) + /* Only for the ALSA layer, we check the sound card information */ + if (layer == ALSA) { - _debug(" Card with index %i doesn't exist or cannot capture. Switch to 0.\n", numCardIn); - numCardIn = ALSA_DFT_CARD_ID ; - setConfig( AUDIO , ALSA_CARD_ID_IN , ALSA_DFT_CARD_ID ); - } - if( !_audiodriver -> soundCardIndexExist( numCardOut , SFL_PCM_PLAYBACK ) ) - { - _debug(" Card with index %i doesn't exist or cannot playback . Switch to 0.\n", numCardOut); - numCardOut = ALSA_DFT_CARD_ID ; - setConfig( AUDIO , ALSA_CARD_ID_OUT , ALSA_DFT_CARD_ID ); + alsalayer = dynamic_cast<AlsaLayer*> (getAudioDriver ()); + if( !alsalayer -> soundCardIndexExist( numCardIn , SFL_PCM_CAPTURE ) ) + { + _debug(" Card with index %i doesn't exist or cannot capture. Switch to 0.\n", numCardIn); + numCardIn = ALSA_DFT_CARD_ID ; + setConfig( AUDIO , ALSA_CARD_ID_IN , ALSA_DFT_CARD_ID ); + } + if( !alsalayer -> soundCardIndexExist( numCardOut , SFL_PCM_PLAYBACK ) ) + { + _debug(" Card with index %i doesn't exist or cannot playback . Switch to 0.\n", numCardOut); + numCardOut = ALSA_DFT_CARD_ID ; + setConfig( AUDIO , ALSA_CARD_ID_OUT , ALSA_DFT_CARD_ID ); + } } _audiodriver->setErrorMessage(-1); @@ -1681,27 +1727,25 @@ ManagerImpl::initVolume() void ManagerImpl::setSpkrVolume(unsigned short spkr_vol) { - AudioLayer *audiolayer = NULL; + PulseLayer *pulselayer = NULL; + /* Set the manager sound volume */ _spkr_volume = spkr_vol; - audiolayer = getAudioDriver(); - if( audiolayer ) + + /* Only for PulseAudio */ + pulselayer = dynamic_cast<PulseLayer*> (getAudioDriver()); + if (pulselayer) { - audiolayer->setPlaybackVolume( spkr_vol ); + if( pulselayer->getLayerType() == PULSEAUDIO ) + { + if(pulselayer) pulselayer->setPlaybackVolume (spkr_vol); + } } - } void ManagerImpl::setMicVolume(unsigned short mic_vol) { - //AudioLayer *audiolayer = NULL; - _mic_volume = mic_vol; - //audiolayer = getAudioDriver(); - //if( audiolayer ) - //{ - // audiolayer->setCaptureVolume( mic_vol ); - //} } void ManagerImpl::setSipPort( int port )