Support audio::stream on_stop callback
This commit is contained in:
parent
425d41eae4
commit
0fa0cbbc09
2 changed files with 24 additions and 3 deletions
|
|
@ -2,6 +2,8 @@
|
|||
|
||||
#include <psemek/audio/effect.hpp>
|
||||
|
||||
#include <psemek/util/function.hpp>
|
||||
|
||||
#include <memory>
|
||||
|
||||
namespace psemek::audio
|
||||
|
|
@ -22,6 +24,8 @@ namespace psemek::audio
|
|||
virtual void stop() = 0;
|
||||
virtual bool is_playing() const = 0;
|
||||
|
||||
virtual void on_stop(util::function<void()> callback) = 0;
|
||||
|
||||
virtual ~stream() {}
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -85,6 +85,8 @@ namespace psemek::audio
|
|||
|
||||
std::vector<std::shared_ptr<effect>> effects;
|
||||
|
||||
util::function<void()> callback;
|
||||
|
||||
stream_impl(int channel, std::shared_ptr<track_impl> track, bool loop, spec_t spec)
|
||||
: channel(channel)
|
||||
, track(track)
|
||||
|
|
@ -152,6 +154,11 @@ namespace psemek::audio
|
|||
{
|
||||
return playing;
|
||||
}
|
||||
|
||||
void on_stop(util::function<void()> callback) override
|
||||
{
|
||||
this->callback = std::move(callback);
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
|
|
@ -268,9 +275,19 @@ namespace psemek::audio
|
|||
}
|
||||
if (!self) return;
|
||||
|
||||
std::lock_guard lock{self->channels_mutex};
|
||||
self->channels[ch].stream->playing = false;
|
||||
self->channels[ch].stream = nullptr;
|
||||
util::function<void()> callback;
|
||||
{
|
||||
// callback will probably lock something as well,
|
||||
// leading to a deadlock, so we have to call the
|
||||
// callback outside of the lock
|
||||
std::lock_guard lock{self->channels_mutex};
|
||||
self->channels[ch].stream->playing = false;
|
||||
callback = std::move(self->channels[ch].stream->callback);
|
||||
self->channels[ch].stream = nullptr;
|
||||
}
|
||||
|
||||
if (callback)
|
||||
callback();
|
||||
}
|
||||
|
||||
engine::engine()
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue