1f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch/* 2f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * libjingle 3f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * Copyright 2004--2005, Google Inc. 4f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * 5f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * Redistribution and use in source and binary forms, with or without 6f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * modification, are permitted provided that the following conditions are met: 7f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * 8f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * 1. Redistributions of source code must retain the above copyright notice, 9f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * this list of conditions and the following disclaimer. 10f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * 2. Redistributions in binary form must reproduce the above copyright notice, 11f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * this list of conditions and the following disclaimer in the documentation 12f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * and/or other materials provided with the distribution. 13f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * 3. The name of the author may not be used to endorse or promote products 14f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * derived from this software without specific prior written permission. 15f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * 16f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 17f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 18f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 19f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 20f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 21f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 22f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 23f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 24f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 25f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch */ 27f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 28f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#ifndef TALK_SESSION_PHONE_CALL_H_ 29f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#define TALK_SESSION_PHONE_CALL_H_ 30f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 31f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include <string> 32f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include <map> 33f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include <vector> 34f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include <deque> 35f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include "talk/base/messagequeue.h" 36f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include "talk/p2p/base/session.h" 37f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include "talk/p2p/client/socketmonitor.h" 38f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include "talk/xmpp/jid.h" 39f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include "talk/session/phone/audiomonitor.h" 404a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "talk/session/phone/voicechannel.h" 41f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 42f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochnamespace cricket { 43f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 44f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochclass MediaSessionClient; 454a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochstruct CallOptions; 46f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 47f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochclass Call : public talk_base::MessageHandler, public sigslot::has_slots<> { 48f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch public: 494a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch Call(MediaSessionClient* session_client); 50f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch ~Call(); 51f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 524a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch Session *InitiateSession(const buzz::Jid &jid, const CallOptions& options); 534a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch void AcceptSession(BaseSession *session, const CallOptions& options); 54f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void RejectSession(BaseSession *session); 55f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void TerminateSession(BaseSession *session); 56f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void Terminate(); 57f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void SetLocalRenderer(VideoRenderer* renderer); 58f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void SetVideoRenderer(BaseSession *session, uint32 ssrc, 59f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch VideoRenderer* renderer); 60f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void AddStream(BaseSession *session, uint32 voice_ssrc, uint32 video_ssrc); 61f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void RemoveStream(BaseSession *session, uint32 voice_ssrc, uint32 video_ssrc); 62f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void StartConnectionMonitor(BaseSession *session, int cms); 63f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void StopConnectionMonitor(BaseSession *session); 64f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void StartAudioMonitor(BaseSession *session, int cms); 65f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void StopAudioMonitor(BaseSession *session); 66f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void Mute(bool mute); 67731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick void PressDTMF(int event); 68f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 69f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch const std::vector<Session *> &sessions(); 70f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch uint32 id(); 71f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch bool video() const { return video_; } 72f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch bool muted() const { return muted_; } 73f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 74f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Setting this to false will cause the call to have a longer timeout and 75f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // for the SignalSetupToCallVoicemail to never fire. 76f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void set_send_to_voicemail(bool send_to_voicemail) { 77f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch send_to_voicemail_ = send_to_voicemail; 78f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 79f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch bool send_to_voicemail() { return send_to_voicemail_; } 80f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 81f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Sets a flag on the chatapp that will redirect the call to voicemail once 82f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // the call has been terminated 83f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch sigslot::signal0<> SignalSetupToCallVoicemail; 84f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch sigslot::signal2<Call *, Session *> SignalAddSession; 85f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch sigslot::signal2<Call *, Session *> SignalRemoveSession; 86731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick sigslot::signal3<Call *, BaseSession *, BaseSession::State> 87731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick SignalSessionState; 88731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick sigslot::signal3<Call *, BaseSession *, Session::Error> 89731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick SignalSessionError; 90731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick sigslot::signal3<Call *, Session *, const std::string &> 91731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick SignalReceivedTerminateReason; 92731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick sigslot::signal2<Call *, const std::vector<ConnectionInfo> &> 93731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick SignalConnectionMonitor; 944a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch sigslot::signal2<Call *, const VoiceMediaInfo&> SignalMediaMonitor; 95f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch sigslot::signal2<Call *, const AudioInfo&> SignalAudioMonitor; 96731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick sigslot::signal2<Call *, const std::vector<ConnectionInfo> &> 97731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick SignalVideoConnectionMonitor; 984a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch sigslot::signal2<Call *, const VideoMediaInfo&> SignalVideoMediaMonitor; 99f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 100f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch private: 101f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void OnMessage(talk_base::Message *message); 102f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void OnSessionState(BaseSession *session, BaseSession::State state); 103f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void OnSessionError(BaseSession *session, Session::Error error); 104f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void OnReceivedTerminateReason(Session *session, const std::string &reason); 105731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick void IncomingSession(Session *session, const SessionDescription* offer); 106f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Returns true on success. 107731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick bool AddSession(Session *session, const SessionDescription* offer); 108f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void RemoveSession(Session *session); 109f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void EnableChannels(bool enable); 110f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void Join(Call *call, bool enable); 111f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void OnConnectionMonitor(VoiceChannel *channel, 112f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch const std::vector<ConnectionInfo> &infos); 1134a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch void OnMediaMonitor(VoiceChannel *channel, const VoiceMediaInfo& info); 114f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void OnAudioMonitor(VoiceChannel *channel, const AudioInfo& info); 115f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void OnConnectionMonitor(VideoChannel *channel, 116f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch const std::vector<ConnectionInfo> &infos); 1174a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch void OnMediaMonitor(VideoChannel *channel, const VideoMediaInfo& info); 118f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch VoiceChannel* GetVoiceChannel(BaseSession* session); 119f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch VideoChannel* GetVideoChannel(BaseSession* session); 120731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick void ContinuePlayDTMF(); 121f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 122f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch uint32 id_; 123f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch MediaSessionClient *session_client_; 124f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch std::vector<Session *> sessions_; 125731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick std::map<std::string, VoiceChannel *> voice_channel_map_; 126731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick std::map<std::string, VideoChannel *> video_channel_map_; 127f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch VideoRenderer* local_renderer_; 128f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch bool video_; 129f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch bool muted_; 130f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch bool send_to_voicemail_; 131f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 132731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // DTMF tones have to be queued up so that we don't flood the call. We 133731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // keep a deque (doubely ended queue) of them around. While one is playing we 134731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // set the playing_dtmf_ bit and schedule a message in XX msec to clear that 135731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // bit or start the next tone playing. 136731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick std::deque<int> queued_dtmf_; 137731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick bool playing_dtmf_; 138f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 139f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch friend class MediaSessionClient; 140f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch}; 141f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 142731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} // namespace cricket 143f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 144f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#endif // TALK_SESSION_PHONE_CALL_H_ 145