This patch allows one to create sink and source on different devices. This is useful e.g. to have a source on a virtual microphone, but the sink on a real soundcard. --- src/modules/module-waveout.c | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/src/modules/module-waveout.c b/src/modules/module-waveout.c index 53efce9..6ac23bc 100644 --- a/src/modules/module-waveout.c +++ b/src/modules/module-waveout.c @@ -49,6 +49,8 @@ PA_MODULE_USAGE( "sink_name=<name for the sink> " "source_name=<name for the source> " "device=<device number> " + "sink_device=<device number> " + "source_device=<device number> " "device_name=<name of the device> " "record=<enable source?> " "playback=<enable sink?> " @@ -95,6 +97,8 @@ static const char* const valid_modargs[] = { "sink_name", "source_name", "device", + "sink_device", + "source_device", "device_name", "record", "playback", @@ -497,7 +501,7 @@ int pa__init(pa_module *m) { MMRESULT result; int nfrags, frag_size; pa_bool_t record = TRUE, playback = TRUE; - unsigned int device; + unsigned int device, source_device; pa_sample_spec ss; pa_channel_map map; pa_modargs *ma = NULL; @@ -525,10 +529,23 @@ int pa__init(pa_module *m) { /* Set the device to be opened. If set device_name is used, * else device if set and lastly WAVE_MAPPER is the default */ device = WAVE_MAPPER; + /* check device first, for backwards compatibility */ if (pa_modargs_get_value_u32(ma, "device", &device) < 0) { pa_log("failed to parse device argument"); goto fail; } + if (pa_modargs_get_value_u32(ma, "sink_device", &device) < 0) { + pa_log("failed to parse device argument"); + goto fail; + } + + source_device = device; /* default is source == sink */ + if (pa_modargs_get_value_u32(ma, "source_device", &source_device) < 0) { + pa_log("failed to parse device argument"); + goto fail; + } + + /* TODO: sink/source_device_name */ if ((device_name = pa_modargs_get_value(ma, "device_name", NULL)) != NULL) { unsigned int num_devices = waveOutGetNumDevs(); for (i = 0; i < num_devices; i++) { @@ -567,12 +584,12 @@ int pa__init(pa_module *m) { u = pa_xmalloc(sizeof(struct userdata)); if (record) { - result = waveInOpen(&hwi, device, &wf, 0, 0, WAVE_FORMAT_DIRECT | WAVE_FORMAT_QUERY); + result = waveInOpen(&hwi, source_device, &wf, 0, 0, WAVE_FORMAT_DIRECT | WAVE_FORMAT_QUERY); if (result != MMSYSERR_NOERROR) { pa_log_warn("Sample spec not supported by WaveIn, falling back to default sample rate."); ss.rate = wf.nSamplesPerSec = m->core->default_sample_spec.rate; } - result = waveInOpen(&hwi, device, &wf, (DWORD_PTR) chunk_ready_cb, (DWORD_PTR) u, CALLBACK_FUNCTION); + result = waveInOpen(&hwi, source_device, &wf, (DWORD_PTR) chunk_ready_cb, (DWORD_PTR) u, CALLBACK_FUNCTION); if (result != MMSYSERR_NOERROR) { char errortext[MAXERRORLENGTH]; pa_log("Failed to open WaveIn."); -- 1.7.10.4