Skip to content

Commit

Permalink
extensions/audio: Add release-notify callback to the packet API
Browse files Browse the repository at this point in the history
To allow zero-copy packet handling the packet consumer needs to keep hold of the
packet_export until the audio data no longer needs to be accessed. In order to
support this, the producer side can now handle this through a release-notify
callback.

Fixes #120
  • Loading branch information
philn committed Jul 17, 2020
1 parent ade6c4d commit 343146b
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 4 deletions.
4 changes: 3 additions & 1 deletion include/wpe/extensions/audio.h
Original file line number Diff line number Diff line change
Expand Up @@ -61,8 +61,10 @@ wpe_audio_source_destroy(struct wpe_audio_source*);
void
wpe_audio_source_start(struct wpe_audio_source* audio_source, uint32_t id, int32_t channels, const char* layout, int32_t sampleRate);

typedef void (*wpe_audio_packet_export_release_notify_t)(void*);

void
wpe_audio_source_packet(struct wpe_audio_source* audio_source, uint32_t id, int32_t fd, uint32_t frames);
wpe_audio_source_packet(struct wpe_audio_source* audio_source, uint32_t id, int32_t fd, uint32_t frames, wpe_audio_packet_export_release_notify_t notify, void* notifyData);

void
wpe_audio_source_stop(struct wpe_audio_source* audio_source, uint32_t id);
Expand Down
24 changes: 21 additions & 3 deletions src/extensions/audio.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -174,14 +174,15 @@ class Audio {
wpe_audio_stream_started(m_wl.audio, id, channels, layout, sampleRate);
}

void packet(uint32_t id, int32_t fd, uint32_t frames)
void packet(uint32_t id, int32_t fd, uint32_t frames, wpe_audio_packet_export_release_notify_t notify, void* notify_data)
{
if (!m_wl.audio)
return;

auto* update = wpe_audio_stream_packet(m_wl.audio, id, fd, frames);

wl_proxy_set_queue(reinterpret_cast<struct wl_proxy*>(update), AudioThread::singleton().eventQueue());
wpe_audio_packet_export_add_listener(update, &s_audioPacketExportListener, new ListenerData { notify, notify_data });
}

void stop(uint32_t id)
Expand All @@ -201,12 +202,29 @@ class Audio {

private:
static const struct wl_registry_listener s_registryListener;
static const struct wpe_audio_packet_export_listener s_audioPacketExportListener;

struct ListenerData {
wpe_audio_packet_export_release_notify_t notify;
void* notify_data;
};

struct {
struct wpe_audio* audio { nullptr };
} m_wl;
};

const struct wpe_audio_packet_export_listener Audio::s_audioPacketExportListener = {
// release
[](void* data, struct wpe_audio_packet_export* update) {
auto* listenerData = static_cast<ListenerData*>(data);
if (listenerData->notify)
listenerData->notify(listenerData->notify_data);
delete listenerData;
wpe_audio_packet_export_destroy(update);
},
};

const struct wl_registry_listener Audio::s_registryListener = {
// global
[](void* data, struct wl_registry* registry, uint32_t name, const char* interface, uint32_t)
Expand Down Expand Up @@ -249,10 +267,10 @@ wpe_audio_source_start(struct wpe_audio_source* audio_source, uint32_t id, int32

__attribute__((visibility("default")))
void
wpe_audio_source_packet(struct wpe_audio_source* audio_source, uint32_t id, int32_t fd, uint32_t frames)
wpe_audio_source_packet(struct wpe_audio_source* audio_source, uint32_t id, int32_t fd, uint32_t frames, wpe_audio_packet_export_release_notify_t notify, void* notifyData)
{
auto& impl = *reinterpret_cast<Impl::Audio*>(audio_source);
impl.packet(id, fd, frames);
impl.packet(id, fd, frames, notify, notifyData);
}

__attribute__((visibility("default")))
Expand Down

0 comments on commit 343146b

Please sign in to comment.