mirror of
https://github.com/signalwire/freeswitch.git
synced 2026-10-17 16:54:13 +00:00
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
196 lines
4.8 KiB
C++
196 lines
4.8 KiB
C++
#include "portaudiocpp/Stream.hxx"
|
|
|
|
#include <cstddef>
|
|
|
|
#include "portaudiocpp/Exception.hxx"
|
|
#include "portaudiocpp/System.hxx"
|
|
|
|
namespace portaudio
|
|
{
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
|
|
Stream::Stream() : stream_(NULL)
|
|
{
|
|
}
|
|
|
|
Stream::~Stream()
|
|
{
|
|
// (can't call close here,
|
|
// the derived class should atleast call
|
|
// close() in it's deconstructor)
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
|
|
//////
|
|
/// Closes the Stream if it's open, else does nothing.
|
|
//////
|
|
void Stream::close()
|
|
{
|
|
if (isOpen() && System::exists())
|
|
{
|
|
PaError err = Pa_CloseStream(stream_);
|
|
stream_ = NULL;
|
|
|
|
if (err != paNoError)
|
|
throw PaException(err);
|
|
}
|
|
}
|
|
|
|
//////
|
|
/// Returns true if the Stream is open.
|
|
//////
|
|
bool Stream::isOpen() const
|
|
{
|
|
return (stream_ != NULL);
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
|
|
void Stream::setStreamFinishedCallback(PaStreamFinishedCallback *callback)
|
|
{
|
|
PaError err = Pa_SetStreamFinishedCallback(stream_, callback);
|
|
|
|
if (err != paNoError)
|
|
throw PaException(err);
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
|
|
void Stream::start()
|
|
{
|
|
PaError err = Pa_StartStream(stream_);
|
|
|
|
if (err != paNoError)
|
|
throw PaException(err);
|
|
}
|
|
|
|
void Stream::stop()
|
|
{
|
|
PaError err = Pa_StopStream(stream_);
|
|
|
|
if (err != paNoError)
|
|
throw PaException(err);
|
|
}
|
|
|
|
void Stream::abort()
|
|
{
|
|
PaError err = Pa_AbortStream(stream_);
|
|
|
|
if (err != paNoError)
|
|
throw PaException(err);
|
|
}
|
|
|
|
bool Stream::isStopped() const
|
|
{
|
|
PaError ret = Pa_IsStreamStopped(stream_);
|
|
|
|
if (ret < 0)
|
|
throw PaException(ret);
|
|
|
|
return (ret == 1);
|
|
}
|
|
|
|
bool Stream::isActive() const
|
|
{
|
|
PaError ret = Pa_IsStreamActive(stream_);
|
|
|
|
if (ret < 0)
|
|
throw PaException(ret);
|
|
|
|
return (ret == 1);
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
|
|
//////
|
|
/// Returns the best known input latency for the Stream. This value may differ from the
|
|
/// suggested input latency set in the StreamParameters. Includes all sources of
|
|
/// latency known to PortAudio such as internal buffering, and Host API reported latency.
|
|
/// Doesn't include any estimates of unknown latency.
|
|
//////
|
|
PaTime Stream::inputLatency() const
|
|
{
|
|
const PaStreamInfo *info = Pa_GetStreamInfo(stream_);
|
|
if (info == NULL)
|
|
{
|
|
throw PaException(paInternalError);
|
|
return PaTime(0.0);
|
|
}
|
|
|
|
return info->inputLatency;
|
|
}
|
|
|
|
//////
|
|
/// Returns the best known output latency for the Stream. This value may differ from the
|
|
/// suggested output latency set in the StreamParameters. Includes all sources of
|
|
/// latency known to PortAudio such as internal buffering, and Host API reported latency.
|
|
/// Doesn't include any estimates of unknown latency.
|
|
//////
|
|
PaTime Stream::outputLatency() const
|
|
{
|
|
const PaStreamInfo *info = Pa_GetStreamInfo(stream_);
|
|
if (info == NULL)
|
|
{
|
|
throw PaException(paInternalError);
|
|
return PaTime(0.0);
|
|
}
|
|
|
|
return info->outputLatency;
|
|
}
|
|
|
|
//////
|
|
/// Returns the sample rate of the Stream. Usually this will be the
|
|
/// best known estimate of the used sample rate. For instance when opening a
|
|
/// Stream setting 44100.0 Hz in the StreamParameters, the actual sample
|
|
/// rate might be something like 44103.2 Hz (due to imperfections in the
|
|
/// sound card hardware).
|
|
//////
|
|
double Stream::sampleRate() const
|
|
{
|
|
const PaStreamInfo *info = Pa_GetStreamInfo(stream_);
|
|
if (info == NULL)
|
|
{
|
|
throw PaException(paInternalError);
|
|
return 0.0;
|
|
}
|
|
|
|
return info->sampleRate;
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
|
|
PaTime Stream::time() const
|
|
{
|
|
return Pa_GetStreamTime(stream_);
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
|
|
//////
|
|
/// Accessor (const) for PortAudio PaStream pointer, useful for interfacing with
|
|
/// PortAudio add-ons such as PortMixer for instance. Normally accessing this
|
|
/// pointer should not be needed as PortAudioCpp aims to provide all of PortAudio's
|
|
/// functionality.
|
|
//////
|
|
const PaStream *Stream::paStream() const
|
|
{
|
|
return stream_;
|
|
}
|
|
|
|
//////
|
|
/// Accessor (non-const) for PortAudio PaStream pointer, useful for interfacing with
|
|
/// PortAudio add-ons such as PortMixer for instance. Normally accessing this
|
|
/// pointer should not be needed as PortAudioCpp aims to provide all of PortAudio's
|
|
/// functionality.
|
|
//////
|
|
PaStream *Stream::paStream()
|
|
{
|
|
return stream_;
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
|
|
} // namespace portaudio
|