mirror of
https://github.com/signalwire/freeswitch.git
synced 2026-07-10 22:31:57 +00:00
39a9e94305
This updates mod_portaudio to use the new v19 api and also contains
major behavioural changes. This initial check-in should be tested to find
any obscure use cases that lead to crashes etc...
All of the old api interface commands are now depricated and any attempt to
use them should cause a polite warning asking you to try the new single "pa" command.
New Features:
*) Mulitiple calls with hold/call switching.
*) Inbound calls can play a ring file on specified device. (global and per call)
*) Optional hold music for backgrounded calls. (global and per call)
Example dialplan usage:
<extension name="2000">
<condition field="destination_number" expression="^2000$">
<!--if the next 3 lines are omitted the defaults will be used from portaudio.conf-->
<action application="set" data="pa_ring_file=/sounds/myring.wav"/>
<action application="set" data="pa_hold_file=/sounds/myhold.wav"/>
<action application="set" data="export_vars=pa_ring_file,pa_hold_file"/>
<action application="bridge" data="portaudio"/>
</condition>
</extension>
Example API interface usage:
call extension 1000
> pa call 1000
call extension 1001 putting the other call on hold
> pa call 1001
swap the calls between hold and active
> pa switch
view the current calls
> pa list
forground the call with id 1
> pa switch 1
background all calls
> pa switch none
send a dtmf string (1234) to the current call
> pa dtmf 1234
answer the oldest unanswered inbound call
> pa answer
answer the call with id 1
> pa answer 1
hangup the active call
> pa hangup
hangup the call with id 1
> pa hangup 1
get device info
> pa dump
print usage summary
> pa help
USAGE:
--------------------------------------------------------------------------------
pa help
pa dump
pa call <dest> [<dialplan> <cid_name> <cid_num> <rate>]
pa answer [<call_id>]
pa hangup [<call_id>]
pa list
pa switch [<call_id>|none]
pa_dtmf <digit string>
--------------------------------------------------------------------------------
The source of the portaudio v19 library will also be checked in for the
sake of the build system.
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@3981 d0543943-73ff-0310-b7d9-9358b9ac24b2
109 lines
3.1 KiB
C++
109 lines
3.1 KiB
C++
#ifndef INCLUDED_PORTAUDIO_EXCEPTION_HXX
|
|
#define INCLUDED_PORTAUDIO_EXCEPTION_HXX
|
|
|
|
// ---------------------------------------------------------------------------------------
|
|
|
|
#include <exception>
|
|
|
|
#include "portaudio.h"
|
|
|
|
// ---------------------------------------------------------------------------------------
|
|
|
|
namespace portaudio
|
|
{
|
|
|
|
//////
|
|
/// @brief Base class for all exceptions PortAudioCpp can throw.
|
|
///
|
|
/// Class is derived from std::exception.
|
|
//////
|
|
class Exception : public std::exception
|
|
{
|
|
public:
|
|
virtual ~Exception() throw() {}
|
|
|
|
virtual const char *what() const throw() = 0;
|
|
};
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
|
|
//////
|
|
/// @brief Wrapper for PortAudio error codes to C++ exceptions.
|
|
///
|
|
/// It wraps up PortAudio's error handling mechanism using
|
|
/// C++ exceptions and is derived from std::exception for
|
|
/// easy exception handling and to ease integration with
|
|
/// other code.
|
|
///
|
|
/// To know what exceptions each function may throw, look up
|
|
/// the errors that can occure in the PortAudio documentation
|
|
/// for the equivalent functions.
|
|
///
|
|
/// Some functions are likely to throw an exception (such as
|
|
/// Stream::open(), etc) and these should always be called in
|
|
/// try{} catch{} blocks and the thrown exceptions should be
|
|
/// handled properly (ie. the application shouldn't just abort,
|
|
/// but merely display a warning dialog to the user or something).
|
|
/// However nearly all functions in PortAudioCpp are capable
|
|
/// of throwing exceptions. When a function like Stream::isStopped()
|
|
/// throws an exception, it's such an exceptional state that it's
|
|
/// not likely that it can be recovered. PaExceptions such as these
|
|
/// can ``safely'' be left to be handled by some outer catch-all-like
|
|
/// mechanism for unrecoverable errors.
|
|
//////
|
|
class PaException : public Exception
|
|
{
|
|
public:
|
|
explicit PaException(PaError error);
|
|
|
|
const char *what() const throw();
|
|
|
|
PaError paError() const;
|
|
const char *paErrorText() const;
|
|
|
|
bool isHostApiError() const; // extended
|
|
long lastHostApiError() const;
|
|
const char *lastHostApiErrorText() const;
|
|
|
|
bool operator==(const PaException &rhs) const;
|
|
bool operator!=(const PaException &rhs) const;
|
|
|
|
private:
|
|
PaError error_;
|
|
};
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
|
|
//////
|
|
/// @brief Exceptions specific to PortAudioCpp (ie. exceptions which do not have an
|
|
/// equivalent PortAudio error code).
|
|
//////
|
|
class PaCppException : public Exception
|
|
{
|
|
public:
|
|
enum ExceptionSpecifier
|
|
{
|
|
UNABLE_TO_ADAPT_DEVICE
|
|
};
|
|
|
|
PaCppException(ExceptionSpecifier specifier);
|
|
|
|
const char *what() const throw();
|
|
|
|
ExceptionSpecifier specifier() const;
|
|
|
|
bool operator==(const PaCppException &rhs) const;
|
|
bool operator!=(const PaCppException &rhs) const;
|
|
|
|
private:
|
|
ExceptionSpecifier specifier_;
|
|
};
|
|
|
|
|
|
} // namespace portaudio
|
|
|
|
// ---------------------------------------------------------------------------------------
|
|
|
|
#endif // INCLUDED_PORTAUDIO_EXCEPTION_HXX
|
|
|