mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-04 13:30:12 -05:00
stream: add pw_stream_new_simple
Make a new method that also makes a remote and connects to it transparently. This saves some lines of code.
This commit is contained in:
parent
f9ceedb714
commit
41a3a924ef
5 changed files with 205 additions and 270 deletions
|
|
@ -59,32 +59,25 @@ struct data {
|
|||
struct pw_core *core;
|
||||
struct pw_type *t;
|
||||
struct pw_remote *remote;
|
||||
struct spa_hook remote_listener;
|
||||
|
||||
struct pw_stream *stream;
|
||||
struct spa_hook stream_listener;
|
||||
|
||||
struct spa_audio_info_raw format;
|
||||
|
||||
double accumulator;
|
||||
};
|
||||
|
||||
static void fill_f32(struct data *d, void *dest, int avail)
|
||||
{
|
||||
float *dst = dest;
|
||||
int n_samples = avail / (sizeof(float) * d->format.channels);
|
||||
float *dst = dest, val;
|
||||
int n_samples = avail / (sizeof(float) * DEFAULT_CHANNELS);
|
||||
int i, c;
|
||||
|
||||
for (i = 0; i < n_samples; i++) {
|
||||
float val;
|
||||
|
||||
d->accumulator += M_PI_M2 * 440 / d->format.rate;
|
||||
d->accumulator += M_PI_M2 * 440 / DEFAULT_RATE;
|
||||
if (d->accumulator >= M_PI_M2)
|
||||
d->accumulator -= M_PI_M2;
|
||||
|
||||
val = sin(d->accumulator);
|
||||
|
||||
for (c = 0; c < d->format.channels; c++)
|
||||
for (c = 0; c < DEFAULT_CHANNELS; c++)
|
||||
*dst++ = val;
|
||||
}
|
||||
}
|
||||
|
|
@ -100,7 +93,6 @@ static void on_process(void *userdata)
|
|||
return;
|
||||
|
||||
buf = b->buffer;
|
||||
|
||||
if ((p = buf->datas[0].data) == NULL)
|
||||
return;
|
||||
|
||||
|
|
@ -116,84 +108,47 @@ static const struct pw_stream_events stream_events = {
|
|||
.process = on_process,
|
||||
};
|
||||
|
||||
static void on_state_changed(void *_data, enum pw_remote_state old, enum pw_remote_state state, const char *error)
|
||||
{
|
||||
struct data *data = _data;
|
||||
struct pw_remote *remote = data->remote;
|
||||
|
||||
switch (state) {
|
||||
case PW_REMOTE_STATE_ERROR:
|
||||
printf("remote error: %s\n", error);
|
||||
pw_main_loop_quit(data->loop);
|
||||
break;
|
||||
|
||||
case PW_REMOTE_STATE_CONNECTED:
|
||||
{
|
||||
const struct spa_pod *params[1];
|
||||
uint8_t buffer[1024];
|
||||
struct spa_pod_builder b = SPA_POD_BUILDER_INIT(buffer, sizeof(buffer));
|
||||
|
||||
printf("remote state: \"%s\"\n",
|
||||
pw_remote_state_as_string(state));
|
||||
|
||||
data->stream = pw_stream_new(remote, "audio-src", NULL);
|
||||
|
||||
params[0] = spa_pod_builder_object(&b,
|
||||
data->t->param.idEnumFormat, data->t->spa_format,
|
||||
"I", data->type.media_type.audio,
|
||||
"I", data->type.media_subtype.raw,
|
||||
":", data->type.format_audio.format, "I", data->type.audio_format.F32,
|
||||
":", data->type.format_audio.channels, "i", DEFAULT_CHANNELS,
|
||||
":", data->type.format_audio.rate, "i", DEFAULT_RATE);
|
||||
|
||||
data->format.channels = DEFAULT_CHANNELS;
|
||||
data->format.rate = DEFAULT_RATE;
|
||||
|
||||
pw_stream_add_listener(data->stream,
|
||||
&data->stream_listener,
|
||||
&stream_events,
|
||||
data);
|
||||
|
||||
pw_stream_connect(data->stream,
|
||||
PW_DIRECTION_OUTPUT,
|
||||
NULL,
|
||||
PW_STREAM_FLAG_AUTOCONNECT |
|
||||
PW_STREAM_FLAG_MAP_BUFFERS |
|
||||
PW_STREAM_FLAG_RT_PROCESS,
|
||||
params, 1);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
printf("remote state: \"%s\"\n", pw_remote_state_as_string(state));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static const struct pw_remote_events remote_events = {
|
||||
PW_VERSION_REMOTE_EVENTS,
|
||||
.state_changed = on_state_changed,
|
||||
};
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
struct data data = { 0, };
|
||||
const struct spa_pod *params[1];
|
||||
uint8_t buffer[1024];
|
||||
struct spa_pod_builder b = SPA_POD_BUILDER_INIT(buffer, sizeof(buffer));
|
||||
|
||||
pw_init(&argc, &argv);
|
||||
|
||||
data.loop = pw_main_loop_new(NULL);
|
||||
data.core = pw_core_new(pw_main_loop_get_loop(data.loop), NULL);
|
||||
data.t = pw_core_get_type(data.core);
|
||||
data.remote = pw_remote_new(data.core, NULL, 0);
|
||||
|
||||
data.stream = pw_stream_new_simple(
|
||||
pw_main_loop_get_loop(data.loop),
|
||||
"audio-src",
|
||||
NULL,
|
||||
&stream_events,
|
||||
&data);
|
||||
|
||||
data.remote = pw_stream_get_remote(data.stream);
|
||||
data.t = pw_core_get_type(pw_remote_get_core(data.remote));
|
||||
init_type(&data.type, data.t->map);
|
||||
|
||||
pw_remote_add_listener(data.remote, &data.remote_listener, &remote_events, &data);
|
||||
params[0] = spa_pod_builder_object(&b,
|
||||
data.t->param.idEnumFormat, data.t->spa_format,
|
||||
"I", data.type.media_type.audio,
|
||||
"I", data.type.media_subtype.raw,
|
||||
":", data.type.format_audio.format, "I", data.type.audio_format.F32,
|
||||
":", data.type.format_audio.channels, "i", DEFAULT_CHANNELS,
|
||||
":", data.type.format_audio.rate, "i", DEFAULT_RATE);
|
||||
|
||||
pw_remote_connect(data.remote);
|
||||
pw_stream_connect(data.stream,
|
||||
PW_DIRECTION_OUTPUT,
|
||||
NULL,
|
||||
PW_STREAM_FLAG_AUTOCONNECT |
|
||||
PW_STREAM_FLAG_MAP_BUFFERS |
|
||||
PW_STREAM_FLAG_RT_PROCESS,
|
||||
params, 1);
|
||||
|
||||
pw_main_loop_run(data.loop);
|
||||
|
||||
pw_core_destroy(data.core);
|
||||
pw_stream_destroy(data.stream);
|
||||
pw_main_loop_destroy(data.loop);
|
||||
|
||||
return 0;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue