qTox  Version: nightly | Commit: bc751c8e1cac455f9690654fcfe0f560d2d7dfdd
coreav.h
Go to the documentation of this file.
1 /*
2  Copyright © 2013 by Maxim Biro <nurupo.contributions@gmail.com>
3  Copyright © 2014-2019 by The qTox Project Contributors
4 
5  This file is part of qTox, a Qt-based graphical interface for Tox.
6 
7  qTox is libre software: you can redistribute it and/or modify
8  it under the terms of the GNU General Public License as published by
9  the Free Software Foundation, either version 3 of the License, or
10  (at your option) any later version.
11 
12  qTox is distributed in the hope that it will be useful,
13  but WITHOUT ANY WARRANTY; without even the implied warranty of
14  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  GNU General Public License for more details.
16 
17  You should have received a copy of the GNU General Public License
18  along with qTox. If not, see <http://www.gnu.org/licenses/>.
19 */
20 
21 #pragma once
22 
23 #include "src/core/toxcall.h"
24 #include "util/compatiblerecursivemutex.h"
25 
26 #include <QObject>
27 #include <QMutex>
28 #include <QReadWriteLock>
29 #include <atomic>
30 #include <memory>
31 #include <tox/toxav.h>
32 
33 class Friend;
34 class Group;
35 class IAudioControl;
36 class IAudioSettings;
37 class IGroupSettings;
38 class QThread;
39 class QTimer;
40 class CoreVideoSource;
41 class CameraSource;
42 class VideoSource;
43 class VideoFrame;
44 class Core;
45 struct vpx_image;
46 
47 class CoreAV : public QObject
48 {
49  Q_OBJECT
50 
51 public:
52  using CoreAVPtr = std::unique_ptr<CoreAV>;
53  static CoreAVPtr makeCoreAV(Tox* core, CompatibleRecursiveMutex& toxCoreLock,
54  IAudioSettings& audioSettings, IGroupSettings& groupSettings);
55 
56  void setAudio(IAudioControl& newAudio);
57  IAudioControl* getAudio();
58 
59  ~CoreAV();
60 
61  bool isCallStarted(const Friend* f) const;
62  bool isCallStarted(const Group* f) const;
63  bool isCallActive(const Friend* f) const;
64  bool isCallActive(const Group* g) const;
65  bool isCallVideoEnabled(const Friend* f) const;
66  bool sendCallAudio(uint32_t friendNum, const int16_t* pcm, size_t samples, uint8_t chans,
67  uint32_t rate) const;
68  void sendCallVideo(uint32_t friendNum, std::shared_ptr<VideoFrame> frame);
69  bool sendGroupCallAudio(int groupNum, const int16_t* pcm, size_t samples, uint8_t chans,
70  uint32_t rate) const;
71 
72  VideoSource* getVideoSourceFromCall(int callNumber) const;
73  void sendNoVideo();
74 
75  void joinGroupCall(const Group& group);
76  void leaveGroupCall(int groupNum);
77  void muteCallInput(const Group* g, bool mute);
78  void muteCallOutput(const Group* g, bool mute);
79  bool isGroupCallInputMuted(const Group* g) const;
80  bool isGroupCallOutputMuted(const Group* g) const;
81 
82  bool isCallInputMuted(const Friend* f) const;
83  bool isCallOutputMuted(const Friend* f) const;
84  void toggleMuteCallInput(const Friend* f);
85  void toggleMuteCallOutput(const Friend* f);
86  static void groupCallCallback(void* tox, uint32_t group, uint32_t peer, const int16_t* data,
87  unsigned samples, uint8_t channels, uint32_t sample_rate,
88  void* core);
89  void invalidateGroupCallPeerSource(const Group& group, ToxPk peerPk);
90 
91 public slots:
92  bool startCall(uint32_t friendNum, bool video);
93  bool answerCall(uint32_t friendNum, bool video);
94  bool cancelCall(uint32_t friendNum);
95  void timeoutCall(uint32_t friendNum);
96  void start();
97 
98 signals:
99  void avInvite(uint32_t friendId, bool video);
100  void avStart(uint32_t friendId, bool video);
101  void avEnd(uint32_t friendId, bool error = false);
102 
103 private slots:
104  static void callCallback(ToxAV* toxAV, uint32_t friendNum, bool audio, bool video, void* self);
105  static void stateCallback(ToxAV*, uint32_t friendNum, uint32_t state, void* self);
106  static void bitrateCallback(ToxAV* toxAV, uint32_t friendNum, uint32_t arate, uint32_t vrate,
107  void* self);
108  static void audioBitrateCallback(ToxAV* toxAV, uint32_t friendNum, uint32_t rate, void* self);
109  static void videoBitrateCallback(ToxAV* toxAV, uint32_t friendNum, uint32_t rate, void* self);
110 
111 private:
113  {
114  void operator()(ToxAV* tox)
115  {
116  toxav_kill(tox);
117  }
118  };
119 
120  CoreAV(std::unique_ptr<ToxAV, ToxAVDeleter> tox, CompatibleRecursiveMutex &toxCoreLock,
121  IAudioSettings& _audioSettings, IGroupSettings& _groupSettings);
122  void connectCallbacks(ToxAV& toxav);
123 
124  void process();
125  static void audioFrameCallback(ToxAV* toxAV, uint32_t friendNum, const int16_t* pcm,
126  size_t sampleCount, uint8_t channels, uint32_t samplingRate,
127  void* self);
128  static void videoFrameCallback(ToxAV* toxAV, uint32_t friendNum, uint16_t w, uint16_t h,
129  const uint8_t* y, const uint8_t* u, const uint8_t* v,
130  int32_t ystride, int32_t ustride, int32_t vstride, void* self);
131 
132 private:
133  static constexpr uint32_t VIDEO_DEFAULT_BITRATE = 2500;
134 
135 private:
136  // atomic because potentially accessed by different threads
137  std::atomic<IAudioControl*> audio;
138  std::unique_ptr<ToxAV, ToxAVDeleter> toxav;
139  std::unique_ptr<QThread> coreavThread;
140  QTimer* iterateTimer = nullptr;
141  using ToxFriendCallPtr = std::unique_ptr<ToxFriendCall>;
146  std::map<uint32_t, ToxFriendCallPtr> calls;
147 
148 
149  using ToxGroupCallPtr = std::unique_ptr<ToxGroupCall>;
154  std::map<int, ToxGroupCallPtr> groupCalls;
155 
156  // protect 'calls' and 'groupCalls'
157  mutable QReadWriteLock callsLock{QReadWriteLock::Recursive};
158 
164  CompatibleRecursiveMutex& coreLock;
165 
166  IAudioSettings& audioSettings;
168 };
CoreAV::~CoreAV
~CoreAV()
Definition: coreav.cpp:158
CoreAV::groupCallCallback
static void groupCallCallback(void *tox, uint32_t group, uint32_t peer, const int16_t *data, unsigned samples, uint8_t channels, uint32_t sample_rate, void *core)
Called from Tox API when group call receives audio data.
Definition: coreav.cpp:467
CoreAV::audio
std::atomic< IAudioControl * > audio
Definition: coreav.h:137
CoreAV::callCallback
static void callCallback(ToxAV *toxAV, uint32_t friendNum, bool audio, bool video, void *self)
Definition: coreav.cpp:717
CoreAV::avInvite
void avInvite(uint32_t friendId, bool video)
Sent when a friend calls us.
CoreAV::iterateTimer
QTimer * iterateTimer
Definition: coreav.h:140
VideoSource
An abstract source of video frames.
Definition: videosource.h:29
CoreAV::ToxGroupCallPtr
std::unique_ptr< ToxGroupCall > ToxGroupCallPtr
Definition: coreav.h:149
CoreAV::isCallVideoEnabled
bool isCallVideoEnabled(const Friend *f) const
Definition: coreav.cpp:242
CoreAV::CoreAV
CoreAV(std::unique_ptr< ToxAV, ToxAVDeleter > tox, CompatibleRecursiveMutex &toxCoreLock, IAudioSettings &_audioSettings, IGroupSettings &_groupSettings)
Definition: coreav.cpp:73
CoreAV::calls
std::map< uint32_t, ToxFriendCallPtr > calls
Maps friend IDs to ToxFriendCall.
Definition: coreav.h:146
IGroupSettings
Definition: igroupsettings.h:26
CoreAV::avStart
void avStart(uint32_t friendId, bool video)
Sent when a call we initiated has started.
CoreAV::sendCallAudio
bool sendCallAudio(uint32_t friendNum, const int16_t *pcm, size_t samples, uint8_t chans, uint32_t rate) const
Send audio frame to a friend.
Definition: coreav.cpp:337
CoreAV::sendNoVideo
void sendNoVideo()
Signal to all peers that we're not sending video anymore.
Definition: coreav.cpp:704
CameraSource
This class is a wrapper to share a camera's captured video frames.
Definition: camerasource.h:34
CoreAV::start
void start()
Starts the CoreAV main loop that calls toxav's main loop.
Definition: coreav.cpp:178
CoreAV::isCallOutputMuted
bool isCallOutputMuted(const Friend *f) const
Returns the calls output (speaker) mute state.
Definition: coreav.cpp:688
CoreAV::bitrateCallback
static void bitrateCallback(ToxAV *toxAV, uint32_t friendNum, uint32_t arate, uint32_t vrate, void *self)
Definition: coreav.cpp:811
CoreAV::isCallActive
bool isCallActive(const Friend *f) const
Checks the call status for a Tox friend.
Definition: coreav.cpp:217
CoreAV::answerCall
bool answerCall(uint32_t friendNum, bool video)
Definition: coreav.cpp:249
CoreAV::connectCallbacks
void connectCallbacks(ToxAV &toxav)
Definition: coreav.cpp:98
CoreAV::ToxFriendCallPtr
std::unique_ptr< ToxFriendCall > ToxFriendCallPtr
Definition: coreav.h:141
CoreAV::coreLock
CompatibleRecursiveMutex & coreLock
needed to synchronize with the Core thread, some toxav_* functions must not execute at the same time ...
Definition: coreav.h:164
CoreAV::cancelCall
bool cancelCall(uint32_t friendNum)
Definition: coreav.cpp:299
CoreAV::getVideoSourceFromCall
VideoSource * getVideoSourceFromCall(int callNumber) const
Get a call's video source.
Definition: coreav.cpp:527
CoreAV::process
void process()
Definition: coreav.cpp:183
CoreAV::ToxAVDeleter::operator()
void operator()(ToxAV *tox)
Definition: coreav.h:114
CoreAV::groupSettings
IGroupSettings & groupSettings
Definition: coreav.h:167
CoreAV::startCall
bool startCall(uint32_t friendNum, bool video)
Definition: coreav.cpp:272
CoreAV::invalidateGroupCallPeerSource
void invalidateGroupCallPeerSource(const Group &group, ToxPk peerPk)
Called from core to make sure the source for that peer is invalidated when they leave.
Definition: coreav.cpp:511
toxcall.h
CoreAV::ToxAVDeleter
Definition: coreav.h:112
ToxPk
This class represents a Tox Public Key, which is a part of Tox ID.
Definition: toxpk.h:26
Friend
Definition: friend.h:31
CoreAV::toggleMuteCallInput
void toggleMuteCallInput(const Friend *f)
Toggles the mute state of the call's input (microphone).
Definition: coreav.cpp:429
CoreAV::audioFrameCallback
static void audioFrameCallback(ToxAV *toxAV, uint32_t friendNum, const int16_t *pcm, size_t sampleCount, uint8_t channels, uint32_t samplingRate, void *self)
Definition: coreav.cpp:842
VideoFrame
An ownernship and management class for AVFrames.
Definition: videoframe.h:55
CoreAV::muteCallOutput
void muteCallOutput(const Group *g, bool mute)
Mutes or unmutes the group call's output (speaker).
Definition: coreav.cpp:620
CoreAV::CoreAVPtr
std::unique_ptr< CoreAV > CoreAVPtr
Definition: coreav.h:52
CoreAV::VIDEO_DEFAULT_BITRATE
static constexpr uint32_t VIDEO_DEFAULT_BITRATE
Picked at random by fair dice roll.
Definition: coreav.h:133
CoreAV::setAudio
void setAudio(IAudioControl &newAudio)
Set the audio backend.
Definition: coreav.cpp:142
CoreAV::sendCallVideo
void sendCallVideo(uint32_t friendNum, std::shared_ptr< VideoFrame > frame)
Definition: coreav.cpp:374
CoreAV::coreavThread
std::unique_ptr< QThread > coreavThread
Definition: coreav.h:139
CoreAV::leaveGroupCall
void leaveGroupCall(int groupNum)
Will not leave the group, just stop the call.
Definition: coreav.cpp:571
CoreAV::isGroupCallInputMuted
bool isGroupCallInputMuted(const Group *g) const
Returns the group calls input (microphone) state.
Definition: coreav.cpp:635
CoreAV::isCallStarted
bool isCallStarted(const Friend *f) const
Checks the call status for a Tox friend.
Definition: coreav.cpp:195
CoreAV::isCallInputMuted
bool isCallInputMuted(const Friend *f) const
Returns the calls input (microphone) mute state.
Definition: coreav.cpp:671
Group
Definition: group.h:34
CoreAV::makeCoreAV
static CoreAVPtr makeCoreAV(Tox *core, CompatibleRecursiveMutex &toxCoreLock, IAudioSettings &audioSettings, IGroupSettings &groupSettings)
Factory method for CoreAV.
Definition: coreav.cpp:113
CoreAV::toxav
std::unique_ptr< ToxAV, ToxAVDeleter > toxav
Definition: coreav.h:138
CoreAV::muteCallInput
void muteCallInput(const Group *g, bool mute)
Mutes or unmutes the group call's input (microphone).
Definition: coreav.cpp:605
CoreAV::isGroupCallOutputMuted
bool isGroupCallOutputMuted(const Group *g) const
Returns the group calls output (speaker) state.
Definition: coreav.cpp:653
CoreAV::videoBitrateCallback
static void videoBitrateCallback(ToxAV *toxAV, uint32_t friendNum, uint32_t rate, void *self)
Definition: coreav.cpp:833
CoreAV::joinGroupCall
void joinGroupCall(const Group &group)
Starts a call in an existing AV groupchat.
Definition: coreav.cpp:545
CoreAV::audioSettings
IAudioSettings & audioSettings
Definition: coreav.h:166
CoreAV::stateCallback
static void stateCallback(ToxAV *, uint32_t friendNum, uint32_t state, void *self)
Definition: coreav.cpp:752
CoreVideoSource
A VideoSource that emits frames received by Core.
Definition: corevideosource.h:28
CoreAV::sendGroupCallAudio
bool sendGroupCallAudio(int groupNum, const int16_t *pcm, size_t samples, uint8_t chans, uint32_t rate) const
Definition: coreav.cpp:580
CoreAV::toggleMuteCallOutput
void toggleMuteCallOutput(const Friend *f)
Toggles the mute state of the call's output (speaker).
Definition: coreav.cpp:444
CoreAV::groupCalls
std::map< int, ToxGroupCallPtr > groupCalls
Maps group IDs to ToxGroupCalls.
Definition: coreav.h:154
CoreAV::audioBitrateCallback
static void audioBitrateCallback(ToxAV *toxAV, uint32_t friendNum, uint32_t rate, void *self)
Definition: coreav.cpp:823
CoreAV::callsLock
QReadWriteLock callsLock
Definition: coreav.h:157
CoreAV::timeoutCall
void timeoutCall(uint32_t friendNum)
Definition: coreav.cpp:317
CoreAV::videoFrameCallback
static void videoFrameCallback(ToxAV *toxAV, uint32_t friendNum, uint16_t w, uint16_t h, const uint8_t *y, const uint8_t *u, const uint8_t *v, int32_t ystride, int32_t ustride, int32_t vstride, void *self)
Definition: coreav.cpp:864
CoreAV
Definition: coreav.h:47
CoreAV::getAudio
IAudioControl * getAudio()
Get the audio backend used.
Definition: coreav.cpp:153
CoreAV::avEnd
void avEnd(uint32_t friendId, bool error=false)
Sent when a call was ended by the peer.
Core
Definition: core.h:59