mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-03 09:01:54 -05:00
modules-ffado: add properties
This commit is contained in:
parent
3c44634dd8
commit
a4f6c02a7d
1 changed files with 94 additions and 15 deletions
|
|
@ -40,7 +40,15 @@
|
|||
* ## Module Options
|
||||
*
|
||||
* - `driver.mode`: the driver mode, sink|source|duplex, default duplex
|
||||
* - `midi.ports`: the number of midi ports. Can also be added to the stream props.
|
||||
* - `ffado.devices`: array of devices to open, default hw:0
|
||||
* - `ffado.period-size`: period size,default 1024
|
||||
* - `ffado.period-num`: period number,default 3
|
||||
* - `ffado.sample-rate`: sample-rate, default 48000
|
||||
* - `ffado.slave-mode`: slave mode
|
||||
* - `ffado.snoop-mode`: snoop mode
|
||||
* - `ffado.verbose`: ffado verbose level
|
||||
* - `latency.internal.input`: extra input latency in frames
|
||||
* - `latency.internal.output`: extra output latency in frames
|
||||
* - `source.props`: Extra properties for the source filter.
|
||||
* - `sink.props`: Extra properties for the sink filter.
|
||||
*
|
||||
|
|
@ -63,10 +71,17 @@
|
|||
* context.modules = [
|
||||
* { name = libpipewire-module-ffado-driver
|
||||
* args = {
|
||||
* #driver.mode = duplex
|
||||
* #midi.ports = 0
|
||||
* #audio.channels = 2
|
||||
* #audio.position = [ FL FR ]
|
||||
* #driver.mode = duplex
|
||||
* #ffado.devices = [ hw:0 ]
|
||||
* #ffado.period-size = 1024
|
||||
* #ffado.period-num = 3
|
||||
* #ffado.sample-rate = 48000
|
||||
* #ffado.slave-mode = false
|
||||
* #ffado.snoop-mode = false
|
||||
* #ffado.verbose = 0
|
||||
* #latency.internal.input = 0
|
||||
* #latency.internal.output = 0
|
||||
* #audio.position = [ FL FR ]
|
||||
* source.props = {
|
||||
* # extra sink properties
|
||||
* }
|
||||
|
|
@ -86,15 +101,27 @@ PW_LOG_TOPIC_STATIC(mod_topic, "mod." NAME);
|
|||
|
||||
#define MAX_PORTS 128
|
||||
|
||||
#define DEFAULT_CHANNELS 2
|
||||
#define DEFAULT_DEVICES "[ hw:0 ]"
|
||||
#define DEFAULT_PERIOD_SIZE 1024
|
||||
#define DEFAULT_PERIOD_NUM 3
|
||||
#define DEFAULT_SAMPLE_RATE 48000
|
||||
#define DEFAULT_SLAVE_MODE false
|
||||
#define DEFAULT_SNOOP_MODE false
|
||||
#define DEFAULT_VERBOSE 0
|
||||
|
||||
#define DEFAULT_POSITION "[ FL FR ]"
|
||||
#define DEFAULT_MIDI_PORTS 1
|
||||
|
||||
#define MODULE_USAGE "( remote.name=<remote> ] " \
|
||||
"( driver.mode=<sink|source|duplex> ] " \
|
||||
"( midi.ports=<number of midi ports> ] " \
|
||||
"( audio.channels=<number of channels> ] " \
|
||||
"( audio.position=<channel map> ] " \
|
||||
#define MODULE_USAGE "( remote.name=<remote> ) " \
|
||||
"( driver.mode=<sink|source|duplex> ) " \
|
||||
"( ffado.devices=<devices array size, default hw:0> ) " \
|
||||
"( ffado.period-size=<period size, default 1024> ) " \
|
||||
"( ffado.period-num=<period num, default 3> ) " \
|
||||
"( ffado.sample-rate=<sampe rate, default 48000> ) " \
|
||||
"( ffado.slave-mode=<slave mode, default false> ) " \
|
||||
"( ffado.snoop-mode=<snoop mode, default false> ) " \
|
||||
"( ffado.verbose=<verbose level, default 0> ) " \
|
||||
"( audio.position=<channel map> ) " \
|
||||
"( source.props=<properties> ) " \
|
||||
"( sink.props=<properties> ) "
|
||||
|
||||
|
|
@ -167,9 +194,17 @@ struct impl {
|
|||
struct stream source;
|
||||
struct stream sink;
|
||||
|
||||
char *devices[FFADO_MAX_SPECSTRINGS];
|
||||
uint32_t n_devices;
|
||||
int32_t sample_rate;
|
||||
int32_t period_size;
|
||||
int32_t n_periods;
|
||||
bool slave_mode;
|
||||
bool snoop_mode;
|
||||
uint32_t verbose;
|
||||
|
||||
uint32_t input_latency;
|
||||
uint32_t output_latency;
|
||||
uint32_t quantum_limit;
|
||||
|
||||
uint32_t pw_xrun;
|
||||
|
|
@ -711,17 +746,22 @@ static int open_ffado_device(struct impl *impl)
|
|||
uint32_t i;
|
||||
|
||||
spa_zero(impl->device_info);
|
||||
spa_zero(impl->device_options);
|
||||
impl->device_info.device_spec_strings = impl->devices;
|
||||
impl->device_info.nb_device_spec_strings = impl->n_devices;
|
||||
|
||||
spa_zero(impl->device_options);
|
||||
impl->device_options.sample_rate = impl->sample_rate;
|
||||
impl->device_options.period_size = impl->period_size;
|
||||
impl->device_options.nb_buffers = impl->n_periods;
|
||||
impl->device_options.realtime = 1;
|
||||
impl->device_options.packetizer_priority = 88;
|
||||
impl->device_options.verbose = impl->verbose;
|
||||
impl->device_options.slave_mode = impl->slave_mode;
|
||||
impl->device_options.snoop_mode = impl->snoop_mode;
|
||||
|
||||
impl->dev = ffado_streaming_init(impl->device_info, impl->device_options);
|
||||
if (impl->dev == NULL) {
|
||||
pw_log_error("can't open FFADO device");
|
||||
pw_log_error("can't open FFADO device %s", impl->devices[0]);
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
|
|
@ -827,6 +867,8 @@ static const struct pw_proxy_events core_proxy_events = {
|
|||
|
||||
static void impl_destroy(struct impl *impl)
|
||||
{
|
||||
uint32_t i;
|
||||
|
||||
if (impl->dev) {
|
||||
stop_ffado_device(impl);
|
||||
ffado_streaming_finish(impl->dev);
|
||||
|
|
@ -843,6 +885,8 @@ static void impl_destroy(struct impl *impl)
|
|||
pw_properties_free(impl->source.props);
|
||||
pw_properties_free(impl->props);
|
||||
|
||||
for (i = 0; i < impl->n_devices; i++)
|
||||
free(impl->devices[i]);
|
||||
free(impl);
|
||||
}
|
||||
|
||||
|
|
@ -868,6 +912,22 @@ static uint32_t channel_from_name(const char *name)
|
|||
return SPA_AUDIO_CHANNEL_UNKNOWN;
|
||||
}
|
||||
|
||||
static void parse_devices(struct impl *impl, const char *val, size_t len)
|
||||
{
|
||||
struct spa_json it[2];
|
||||
char v[FFADO_MAX_SPECSTRING_LENGTH];
|
||||
|
||||
spa_json_init(&it[0], val, len);
|
||||
if (spa_json_enter_array(&it[0], &it[1]) <= 0)
|
||||
spa_json_init(&it[1], val, len);
|
||||
|
||||
impl->n_devices = 0;
|
||||
while (spa_json_get_string(&it[1], v, sizeof(v)) > 0 &&
|
||||
impl->n_devices < FFADO_MAX_SPECSTRINGS) {
|
||||
impl->devices[impl->n_devices++] = strdup(v);
|
||||
}
|
||||
}
|
||||
|
||||
static void parse_position(struct spa_audio_info_raw *info, const char *val, size_t len)
|
||||
{
|
||||
struct spa_json it[2];
|
||||
|
|
@ -937,8 +997,27 @@ int pipewire__module_init(struct pw_impl_module *module, const char *args)
|
|||
goto error;
|
||||
}
|
||||
impl->props = props;
|
||||
impl->period_size = 1024;
|
||||
impl->sample_rate = 48000;
|
||||
str = pw_properties_get(props, "ffado.devices");
|
||||
if (str == NULL)
|
||||
str = DEFAULT_DEVICES;
|
||||
parse_devices(impl, str, strlen(str));
|
||||
|
||||
impl->period_size = pw_properties_get_int32(props,
|
||||
"ffado.period-size", DEFAULT_PERIOD_SIZE);
|
||||
impl->n_periods = pw_properties_get_int32(props,
|
||||
"ffado.period-num", DEFAULT_PERIOD_NUM);
|
||||
impl->sample_rate = pw_properties_get_int32(props,
|
||||
"ffado.sample-rate", DEFAULT_SAMPLE_RATE);
|
||||
impl->slave_mode = pw_properties_get_bool(props,
|
||||
"ffado.slave-mode", DEFAULT_SLAVE_MODE);
|
||||
impl->snoop_mode = pw_properties_get_bool(props,
|
||||
"ffado.snoop-mode", DEFAULT_SNOOP_MODE);
|
||||
impl->verbose = pw_properties_get_uint32(props,
|
||||
"ffado.verbose", DEFAULT_VERBOSE);
|
||||
impl->input_latency = pw_properties_get_uint32(props,
|
||||
"latency.internal.input", 0);
|
||||
impl->output_latency = pw_properties_get_uint32(props,
|
||||
"latency.internal.output", 0);
|
||||
impl->quantum_limit = 8192;
|
||||
impl->utils = pw_thread_utils_get();
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue