From e2bc6f4153813cc570ae814c8ddb74628009b488 Mon Sep 17 00:00:00 2001 From: Michal Kubecek Date: Mon, 13 Apr 2015 09:21:39 +0200 Subject: initial checkin Check in contents of upstream 1.4.2 tarball, exclude generated files. --- src/audio/audio_session.h | 182 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 182 insertions(+) create mode 100644 src/audio/audio_session.h (limited to 'src/audio/audio_session.h') diff --git a/src/audio/audio_session.h b/src/audio/audio_session.h new file mode 100644 index 0000000..422dbcd --- /dev/null +++ b/src/audio/audio_session.h @@ -0,0 +1,182 @@ +/* + Copyright (C) 2005-2009 Michel de Boer + + 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 +*/ + +#ifndef _AUDIO_SESSION_H +#define _AUDIO_SESSION_H + +#include +#include +#include "audio_rx.h" +#include "audio_tx.h" +#include "session.h" +#include "twinkle_rtp_session.h" +#include "threads/thread.h" +#include "threads/mutex.h" + +#ifdef HAVE_SPEEX +#include +#endif + +using namespace std; +using namespace ost; + +// Forward declarations +class t_session; +class t_line; + +class t_audio_session { +private: + // SIP session owning this audio session + t_session *session; + + /** Mutex for concurrent access to the session. */ + mutable t_mutex mtx_session; + + // This flag indicates if the created audio session is valid. + // It might be invalid because, the RTP session could not be created + // or the soundcard could not be opened. + bool valid; + + // file descriptor audio device + t_audio_io *speaker; + t_audio_io *mic; + t_twinkle_rtp_session *rtp_session; + + t_audio_codec codec; + unsigned short ptime; // in milliseconds + + t_thread *thr_audio_rx; // recording thread + t_thread *thr_audio_tx; // playing thread + + // ZRTP info + mutable t_mutex mtx_zrtp_data; + bool is_encrypted; + string zrtp_sas; + bool zrtp_sas_confirmed; + string srtp_cipher_mode; + +#ifdef HAVE_SPEEX + // Indicator whether to use (Speex) AEC + bool do_echo_cancellation; + + // Indicator whether the last operation of (Speex) AEC, + // speex_echo_capture or speex_echo_playback, was the speex_echo_capture + bool echo_captured_last; + + // speex AEC state + SpeexEchoState *speex_echo_state; +#endif + + // 3-way conference data + // Returns if this audio session is part of a 3-way conference + bool is_3way(void) const; + + // Returns the peer audio session of a 3-way conference + t_audio_session *get_peer_3way(void) const; + + // Open the sound card + bool open_dsp(void); + bool open_dsp_full_duplex(void); + bool open_dsp_speaker(void); + bool open_dsp_mic(void); + +public: + + t_audio_rx *audio_rx; + t_audio_tx *audio_tx; + + + t_audio_session(t_session *_session, + const string &_recv_host, unsigned short _recv_port, + const string &_dst_host, unsigned short _dst_port, + t_audio_codec _codec, unsigned short _ptime, + const map &recv_payload2ac, + const map &send_ac2payload, + bool encrypt); + + ~t_audio_session(); + + void run(void); + + /** + * Change the owning session. + * @param _session New session owning this audio session. + */ + void set_session(t_session *_session); + + // Set outgoing/incoming DTMF dynamic payload types + void set_pt_out_dtmf(unsigned short pt); + void set_pt_in_dtmf(unsigned short pt, unsigned short pt_alt); + + // Send DTMF digit + void send_dtmf(char digit, bool inband); + + // Get the line that belongs to this audio session + t_line *get_line(void) const; + + // Become the first session in a 3-way conference + void start_3way(void); + + // Leave a 3-way conference + void stop_3way(void); + + // Check if audio session is valid + bool is_valid(void) const; + + // Get pointer for soundcard I/O object + t_audio_io* get_dsp_speaker(void) const; + t_audio_io* get_dsp_mic(void) const; + + // Check if sample rate from speaker and mic match with sample rate + // from codec. The sample rates might not match due to 3-way conference + // calls with mixed sample rate + bool matching_sample_rates(void) const; + + // ZRTP actions + void confirm_zrtp_sas(void); + void reset_zrtp_sas_confirmation(void); + void enable_zrtp(void); + void zrtp_request_go_clear(void); + void zrtp_go_clear_ok(void); + + // ZRTP data manipulations + bool get_is_encrypted(void) const; + string get_zrtp_sas(void) const; + bool get_zrtp_sas_confirmed(void) const; + string get_srtp_cipher_mode(void) const; + + void set_is_encrypted(bool on); + void set_zrtp_sas(const string &sas); + void set_zrtp_sas_confirmed(bool confirmed); + void set_srtp_cipher_mode(const string &cipher_mode); + +#ifdef HAVE_SPEEX + // speex acoustic echo cancellation (AEC) manipulations + bool get_do_echo_cancellation(void) const; + bool get_echo_captured_last(void); + void set_echo_captured_last(bool value); + SpeexEchoState *get_speex_echo_state(void); +#endif + +}; + +// Main functions for rx and tx threads +void *main_audio_rx(void *arg); +void *main_audio_tx(void *arg); + +#endif -- cgit v1.2.3