test(audio): define the static callback tables after their classes

pull/18/head
reionwong 1 week ago
parent 4ea80790ee
commit 4f4c90eab1

@ -149,30 +149,32 @@ private:
pw_proxy *m_proxy = nullptr;
pw_core *m_core = nullptr;
inline static const spa_device_methods methods = [] {
spa_device_methods methods {};
methods.version = SPA_VERSION_DEVICE_METHODS;
methods.add_listener = [](void *object, spa_hook *listener, const spa_device_events *events, void *data) {
auto *self = static_cast<FakeAudioDevice *>(object);
spa_hook_list_append(&self->m_hooks, listener, events, data);
const spa_device_info info {SPA_VERSION_DEVICE_INFO, SPA_DEVICE_CHANGE_MASK_PARAMS,
0, nullptr, self->m_params, 4};
if (events->info)
events->info(data, &info);
return 0;
};
methods.sync = [](void *object, int seq) {
auto *self = static_cast<FakeAudioDevice *>(object);
spa_device_emit_result(&self->m_hooks, seq, 0, 0, nullptr);
return 0;
};
methods.enum_params = [](void *object, int seq, uint32_t id, uint32_t start, uint32_t count, const spa_pod *) {
return static_cast<FakeAudioDevice *>(object)->enumerate(seq, id, start, count);
};
methods.set_param = [](void *object, uint32_t id, uint32_t, const spa_pod *param) {
return static_cast<FakeAudioDevice *>(object)->setParam(id, param);
};
return methods;
}();
static const spa_device_methods methods;
};
inline const spa_device_methods FakeAudioDevice::methods = [] {
spa_device_methods methods {};
methods.version = SPA_VERSION_DEVICE_METHODS;
methods.add_listener = [](void *object, spa_hook *listener, const spa_device_events *events, void *data) {
auto *self = static_cast<FakeAudioDevice *>(object);
spa_hook_list_append(&self->m_hooks, listener, events, data);
const spa_device_info info {SPA_VERSION_DEVICE_INFO, SPA_DEVICE_CHANGE_MASK_PARAMS,
0, nullptr, self->m_params, 4};
if (events->info)
events->info(data, &info);
return 0;
};
methods.sync = [](void *object, int seq) {
auto *self = static_cast<FakeAudioDevice *>(object);
spa_device_emit_result(&self->m_hooks, seq, 0, 0, nullptr);
return 0;
};
methods.enum_params = [](void *object, int seq, uint32_t id, uint32_t start, uint32_t count, const spa_pod *) {
return static_cast<FakeAudioDevice *>(object)->enumerate(seq, id, start, count);
};
methods.set_param = [](void *object, uint32_t id, uint32_t, const spa_pod *param) {
return static_cast<FakeAudioDevice *>(object)->setParam(id, param);
};
return methods;
}();

@ -64,32 +64,34 @@ private:
bool m_capture;
float m_level;
inline static const pw_stream_events events = [] {
pw_stream_events events {};
events.version = PW_VERSION_STREAM_EVENTS;
events.state_changed = [](void *data, pw_stream_state, pw_stream_state state, const char *) {
static_cast<TestStream *>(data)->streaming = state == PW_STREAM_STATE_STREAMING;
};
events.process = [](void *data) {
auto *self = static_cast<TestStream *>(data);
pw_buffer *buffer = pw_stream_dequeue_buffer(self->m_stream);
if (!buffer)
return;
if (!self->m_capture && buffer->buffer->n_datas > 0) {
spa_data &data = buffer->buffer->datas[0];
if (data.data && data.chunk) {
constexpr uint32_t stride = 2 * sizeof(float);
const uint32_t frames = buffer->requested
? std::min<uint64_t>(buffer->requested, data.maxsize / stride) : data.maxsize / stride;
std::fill_n(static_cast<float *>(data.data), frames * 2, self->m_level);
data.chunk->offset = 0;
data.chunk->size = frames * stride;
data.chunk->stride = stride;
buffer->size = frames;
}
}
pw_stream_queue_buffer(self->m_stream, buffer);
};
return events;
}();
static const pw_stream_events events;
};
inline const pw_stream_events TestStream::events = [] {
pw_stream_events events {};
events.version = PW_VERSION_STREAM_EVENTS;
events.state_changed = [](void *data, pw_stream_state, pw_stream_state state, const char *) {
static_cast<TestStream *>(data)->streaming = state == PW_STREAM_STATE_STREAMING;
};
events.process = [](void *data) {
auto *self = static_cast<TestStream *>(data);
pw_buffer *buffer = pw_stream_dequeue_buffer(self->m_stream);
if (!buffer)
return;
if (!self->m_capture && buffer->buffer->n_datas > 0) {
spa_data &data = buffer->buffer->datas[0];
if (data.data && data.chunk) {
constexpr uint32_t stride = 2 * sizeof(float);
const uint32_t frames = buffer->requested
? std::min<uint64_t>(buffer->requested, data.maxsize / stride) : data.maxsize / stride;
std::fill_n(static_cast<float *>(data.data), frames * 2, self->m_level);
data.chunk->offset = 0;
data.chunk->size = frames * stride;
data.chunk->stride = stride;
buffer->size = frames;
}
}
pw_stream_queue_buffer(self->m_stream, buffer);
};
return events;
}();

Loading…
Cancel
Save