10#ifndef RTPAUDIOSTREAM_H
11#define RTPAUDIOSTREAM_H
15#ifdef QT_MULTIMEDIA_LIB
31#include <QAudioOutput>
41class RtpAudioStream :
public QObject
60 explicit RtpAudioStream(QObject *parent,
rtpstream_id_t *
id,
bool stereo_required);
80 bool isMatch(
const struct _packet_info *pinfo,
const struct _rtp_info *rtp_info)
const;
87 void addRtpPacket(
const struct _packet_info *pinfo,
const struct _rtp_info *rtp_info);
98 void reset(
double global_start_time);
104 AudioRouting getAudioRouting();
110 void setAudioRouting(AudioRouting audio_routing);
116 void decode(QAudioDevice out_device);
127 double startRelTime()
const {
return start_rel_time_; }
133 double stopRelTime()
const {
return stop_rel_time_; }
139 unsigned sampleRate()
const {
return first_sample_rate_; }
145 unsigned playRate()
const {
return audio_out_rate_; }
151 void setRequestedPlayRate(
unsigned new_rate) { audio_requested_out_rate_ = new_rate; }
157 void setVisualSampleRate(
unsigned new_rate) { visual_sample_rate_ = new_rate; }
163 const QStringList payloadNames()
const;
170 const QVector<double> visualTimestamps(
bool relative =
true);
178 const QVector<double> visualSamples(
int y_offset = 0);
185 const QVector<double> outOfSequenceTimestamps(
bool relative =
true);
191 int outOfSequence() {
return static_cast<int>(out_of_seq_timestamps_.size()); }
198 const QVector<double> outOfSequenceSamples(
int y_offset = 0);
205 const QVector<double> jitterDroppedTimestamps(
bool relative =
true);
211 int jitterDropped() {
return static_cast<int>(jitter_drop_timestamps_.size()); }
218 const QVector<double> jitterDroppedSamples(
int y_offset = 0);
225 const QVector<double> wrongTimestampTimestamps(
bool relative =
true);
231 int wrongTimestamps() {
return static_cast<int>(wrong_timestamp_timestamps_.size()); }
238 const QVector<double> wrongTimestampSamples(
int y_offset = 0);
245 const QVector<double> insertedSilenceTimestamps(
bool relative =
true);
251 int insertedSilences() {
return static_cast<int>(silence_timestamps_.size()); }
258 const QVector<double> insertedSilenceSamples(
int y_offset = 0);
266 quint32 nearestPacket(
double timestamp,
bool is_relative =
true);
272 QColor color() {
return color_; }
278 void setColor(QColor color) { color_ = color; }
284 QAudio::State outputState()
const;
290 void setJitterBufferSize(
int jitter_buffer_size) { jitter_buffer_size_ = jitter_buffer_size; }
296 void setTimingMode(TimingMode timing_mode) { timing_mode_ = timing_mode; }
302 void setStartPlayTime(
double start_play_time) { start_play_time_ = start_play_time; }
309 bool prepareForPlay(QAudioDevice out_device);
330 void seekPlaying(qint64 samples);
336 void setStereoRequired(
bool stereo_required) { stereo_required_ = stereo_required; }
342 qint16 getMaxSampleValue() {
return max_sample_val_; }
348 void setMaxSampleValue(int16_t max_sample_val) { max_sample_val_ = max_sample_val; }
354 void seekSample(qint64 samples);
361 qint64 readSample(SAMPLE *sample);
367 qint64 getLeadSilenceSamples() {
return prepend_samples_; }
373 qint64 getTotalSamples() {
return (audio_file_->getTotalSamples()); }
379 qint64 getEndOfSilenceSample() {
return (audio_file_->getEndOfSilenceSample()); }
385 double getEndOfSilenceTime() {
return (
double)getEndOfSilenceSample() / (double)playRate(); }
392 qint64 convertTimeToSamples(
double time) {
return (qint64)(time * playRate()); }
399 bool savePayload(QIODevice *file);
405 unsigned getHash() {
return rtpstream_id_to_hash(&(id_)); }
417 QString getIDAsQString();
430 void processedSecs(
double secs);
436 void playbackError(
const QString error_msg);
443 void finishedPlaying(RtpAudioStream *stream, QAudio::Error error);
454 QVector<struct _rtp_packet *>rtp_packets_;
456 RtpAudioFile *audio_file_;
458 QIODevice *temp_file_;
460 struct _GHashTable *decoders_hash_;
462 double global_start_rel_time_;
464 double start_abs_offset_;
466 double start_rel_time_;
468 double stop_rel_time_;
470 qint64 prepend_samples_;
472 AudioRouting audio_routing_;
474 bool stereo_required_;
476 quint32 first_sample_rate_;
478 quint32 audio_out_rate_;
480 quint32 audio_requested_out_rate_;
482 uint32_t visual_sample_rate_;
484 QSet<QString> payload_names_;
486 struct SpeexResamplerState_ *visual_resampler_;
488 QMap<double, quint32> packet_timestamps_;
490 QVector<qint16> visual_samples_;
492 QVector<double> out_of_seq_timestamps_;
494 QVector<double> jitter_drop_timestamps_;
496 QVector<double> wrong_timestamp_timestamps_;
498 QVector<double> silence_timestamps_;
501 qint16 max_sample_val_;
504 qint16 max_sample_val_used_;
510 int jitter_buffer_size_;
513 TimingMode timing_mode_;
516 double start_play_time_;
523 const QString formatDescription(
const QAudioFormat & format);
529 QString currentOutputDevice();
532 QAudioSink *audio_output_;
538 void decodeAudio(QAudioDevice out_device);
547 quint32 calculateAudioOutRate(QAudioDevice out_device,
unsigned int sample_rate,
unsigned int requested_out_rate);
556 SAMPLE *resizeBufferIfNeeded(SAMPLE *buff, int32_t *buff_bytes, qint64 requested_size);
563 void outputStateChanged(QAudio::State new_state);
568 void delayedStopStream();
struct _rtpstream_info rtpstream_info_t
Holds all state and statistics accumulated for a single RTP stream.
struct _rtpstream_id rtpstream_id_t