Skip to content
Snippets Groups Projects
Commit a436351a authored by Adrien Béraud's avatar Adrien Béraud Committed by Philippe Gorley
Browse files

audioframeresizer: make dequeue public


Change-Id: I5351b93c36cb283b9bbcaeb31c6aef76e10050ff
Reviewed-by: default avatarPhilippe Gorley <philippe.gorley@savoirfairelinux.com>
parent 30c20118
Branches
No related tags found
No related merge requests found
...@@ -30,13 +30,11 @@ extern "C" { ...@@ -30,13 +30,11 @@ extern "C" {
namespace ring { namespace ring {
// NOTE 160 samples should the minimum that will be provided (20 ms @ 8kHz), AudioFrameResizer::AudioFrameResizer(const AudioFormat& format, int size, std::function<void(std::shared_ptr<AudioFrame>&&)> cb)
// barring files that for some obscure reason have smaller packets
AudioFrameResizer::AudioFrameResizer(const AudioFormat& format, int frameSize, std::function<void(std::unique_ptr<AudioFrame>&&)> cb)
: format_(format) : format_(format)
, frameSize_(frameSize) , frameSize_(size)
, cb_(cb) , cb_(cb)
, queue_(av_audio_fifo_alloc(format.sampleFormat, format.nb_channels, 160)) , queue_(av_audio_fifo_alloc(format.sampleFormat, format.nb_channels, frameSize_))
{} {}
AudioFrameResizer::~AudioFrameResizer() AudioFrameResizer::~AudioFrameResizer()
...@@ -63,7 +61,32 @@ AudioFrameResizer::format() const ...@@ -63,7 +61,32 @@ AudioFrameResizer::format() const
} }
void void
AudioFrameResizer::enqueue(std::unique_ptr<AudioFrame>&& frame) AudioFrameResizer::setFormat(const AudioFormat& format, int size)
{
if (format != format_) {
if (auto discaded = samples())
RING_WARN("Discarding %d samples", discaded);
av_audio_fifo_free(queue_);
format_ = format;
queue_ = av_audio_fifo_alloc(format.sampleFormat, format.nb_channels, frameSize_);
}
if (size)
setFrameSize(size);
}
void
AudioFrameResizer::setFrameSize(int frameSize)
{
if (frameSize_ != frameSize) {
frameSize_ = frameSize;
if (cb_)
while (auto frame = dequeue())
cb_(std::move(frame));
}
}
void
AudioFrameResizer::enqueue(std::shared_ptr<AudioFrame>&& frame)
{ {
int ret = 0; int ret = 0;
auto f = frame->pointer(); auto f = frame->pointer();
...@@ -83,11 +106,12 @@ AudioFrameResizer::enqueue(std::unique_ptr<AudioFrame>&& frame) ...@@ -83,11 +106,12 @@ AudioFrameResizer::enqueue(std::unique_ptr<AudioFrame>&& frame)
throw std::runtime_error("Failed to add audio to frame resizer"); throw std::runtime_error("Failed to add audio to frame resizer");
} }
if (cb_)
while (auto frame = dequeue()) while (auto frame = dequeue())
cb_(std::move(frame)); cb_(std::move(frame));
} }
std::unique_ptr<AudioFrame> std::shared_ptr<AudioFrame>
AudioFrameResizer::dequeue() AudioFrameResizer::dequeue()
{ {
if (samples() < frameSize_) if (samples() < frameSize_)
......
...@@ -39,7 +39,7 @@ namespace ring { ...@@ -39,7 +39,7 @@ namespace ring {
*/ */
class AudioFrameResizer { class AudioFrameResizer {
public: public:
AudioFrameResizer(const AudioFormat& format, int frameSize, std::function<void(std::unique_ptr<AudioFrame>&&)> cb); AudioFrameResizer(const AudioFormat& format, int frameSize, std::function<void(std::shared_ptr<AudioFrame>&&)> cb = {});
~AudioFrameResizer(); ~AudioFrameResizer();
/** /**
...@@ -53,6 +53,9 @@ public: ...@@ -53,6 +53,9 @@ public:
*/ */
AudioFormat format() const; AudioFormat format() const;
void setFormat(const AudioFormat& format, int frameSize);
void setFrameSize(int frameSize);
/** /**
* Gets the number of samples per output frame. * Gets the number of samples per output frame.
*/ */
...@@ -66,15 +69,15 @@ public: ...@@ -66,15 +69,15 @@ public:
* *
* NOTE @frame's format must match @format_, or this will fail. * NOTE @frame's format must match @format_, or this will fail.
*/ */
void enqueue(std::unique_ptr<AudioFrame>&& frame); void enqueue(std::shared_ptr<AudioFrame>&& frame);
private:
NON_COPYABLE(AudioFrameResizer);
/** /**
* Notifies owner of a new frame. * Notifies owner of a new frame.
*/ */
std::unique_ptr<AudioFrame> dequeue(); std::shared_ptr<AudioFrame> dequeue();
private:
NON_COPYABLE(AudioFrameResizer);
/** /**
* Format used for input and output audio frames. * Format used for input and output audio frames.
...@@ -89,7 +92,7 @@ private: ...@@ -89,7 +92,7 @@ private:
/** /**
* Function to call once @queue_ contains enough samples to produce a frame. * Function to call once @queue_ contains enough samples to produce a frame.
*/ */
std::function<void(std::unique_ptr<AudioFrame>&&)> cb_; std::function<void(std::shared_ptr<AudioFrame>&&)> cb_;
/** /**
* Audio queue operating on the sample level instead of byte level. * Audio queue operating on the sample level instead of byte level.
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment