JACK driver for WINE

Jeremy Banks korethr at gmail.com
Fri Aug 18 15:07:29 CDT 2017


On 08/18/2017 06:55 AM, Andrew Eikum wrote:

> Hey Jeremy, thanks for your interest! Like Austin said, I do most of
> the audio stuff in Wine these days, so you'll probably be working
> mostly with me.
Thank you for taking the time to reply. I noticed that a reply was going 
directly to you, instead of the mailing list, and so hit reply-all. If 
this was supposed to be an off-list conversation, I apologize, and will 
direct future replies directly to you.
> First, I'd request that you try out the alternatives to implementing a
> driver. I don't know what your requirements are, but there are
> existing solutions for running PulseAudio on top of JACK.  I'm not
> super familiar with JACK, but I think you'll want to follow the
> "Redirecting PulseAudio to JACK" section here[1], then make sure Wine
> is using the winepulse driver.
>
> If that doesn't meet your requirements, you could also try redirecting
> winealsa to JACK, see[2,3]. This may have lower latency than running
> PA.
My use case is recording videos of applications running under Wine, 
often alongside my running commentary. I initially did use the winepulse 
driver, as most applications on my computer use PA for general sound 
(some require it). JACK gets used when I'm wanting to capture audio from 
my external audio interface, capture multiple sources synchronously so 
to reduce the amount of manual aligning I have to do when editing and 
mixing, or during said editing and mixing. As I run both Pulse and Jack, 
I initially was using the PA -> JACK setup you linked below[1], as it 
seemed the simplest/easiest solution.

However, I became displeased with that when I discovered that the PA -> 
JACK bridge was prone to random buffer under/over runs, even with 
relatively large buffer settings in JACK, and that it would drift out of 
sync over longer periods of time. I did take a look at the guides you 
linked at [3], but was left with the impression that doing so would 
bring even more complexity to the sound setup on my computer, leaving 
more opportunity for mis-configuration or breakage. It occurred to me 
that perhaps the Right Thing would be to have Wine talking to JACK 
natively. When I looked into this and found that Wine did have a JACK 
driver at one point previously, I thought, "It was done before. How hard 
could it be?" (Yes, I know that's a dangerous line of thinking :). )
> The reason we resist adding new drivers is it adds a lot of work for
> the maintainers (i.e., me). I test each significant change to any part
> of our audio code on all four of our existing drivers (ALSA, OSS,
> PulseAudio, and macOS's CoreAudio), both by running the Wine unit
> tests and by testing all of the many audio applications I have that
> use the relevant APIs. On top of the testing itself, that means I have
> to understand how to run and maintain all four of those audio systems
> on my hardware.  Further, any bug fixed or new feature added to one
> driver has to be understood and replicated in all other drivers, if
> applicable.
>
> So you can see why I'd request you try existing solutions before
> jumping straight to a new audio driver. If you can convince me that
> existing solutions don't work for your requirements, then we can talk
> about adding a new driver to Wine. I'd at least like to be convinced
> that you've already tried alternatives and understand why they are
> unacceptable for your usecase.
I understand why you'd be reluctant to add another driver and can 
sympathize about maintenance burden it would impose. I'd hoped that if I 
could implement such a driver correctly, it wouldn't impose an undue 
maintenance burden, and the ability to now talk natively to JACK would 
be worth it. If you ultimately decide you do not want a JACK driver, I'm 
tempted to try to implement one anyway, even if it stays my own private 
patch and never makes it upstream. After looking at the Wine source and 
the JACK documentation, my curiosity is thoroughly piqued. Even if 
nothing ever comes of it, odds are I'll learn something, which is seldom 
a bad thing.
> Once you get over that hurdle, you'll need to implement a winejack.drv
> similar to winealsa, winepulse, winecoreaudio, or wineoss. You'll want
> to copy whichever is closest to JACK's API and then modify it to use
> JACK. winealsa and wineoss operate in push mode (we maintain our own
> timers to keep the audio buffer full). winepulse and winecoreaudio are
> in pull mode (the audio system asks us to provide it with data). I
> don't recall which type of API JACK is.
I'll need to research this more to understand the distinction between 
the two. I know that JACK's API is implemented with callbacks, the main 
one being a process callback that JACK calls regularly when it wants a 
program to move data in or out of its buffers.
> At a very high level, you'll need to implement all of the functions in
> the .spec file. You can look into the existing drivers to understand
> what those APIs do. The audio drivers export a few COM interfaces,
> which are used directly by applications or by dsound, winmm, and some
> other modules. The really important interfaces are IAudioClient,
> IAudioRenderClient, IAudioCaptureClient, and IAudioClock, and there
> are a few lesser-used interfaces besides.
>
> Once you've implemented those interfaces, they'll need to pass the
> tests mentioned on the wiki page.
I noticed those .spec files in the driver sources. I've been trying to 
put together a mental model of how the drivers in Wine work. I noticed 
the first function on each line wasn't in the driver source file, but 
often the 2nd function was (though the ones in the MMDevAPI section do 
have nigh-identical names). Do I correctly understand that for a line in 
the .spec file, the first function listed is the function that will be 
called by MMDevAPi or the application, and the second one is the 
function that the former will be translated to? Do I correctly 
understand that the driver files thus contain the translated function 
calls, plus any additional necessary support functions and data 
structure needed for getting data to and from the audio system in question?

It occurs to me that since Wine interfaces with Windows applications, I 
might want to study the documentation for the Windows sound and driver 
APIs. Is this a correct assumption, or is this not particularly 
necessary in this case?
> [1] https://github.com/jackaudio/jackaudio.github.com/wiki/WalkThrough_User_PulseOnJack
>
> [2] https://wiki.winehq.org/Sound#What_about_JACK.3F
>
> [3] http://jackaudio.org/faq/routing_alsa.html
>
> Andrew
Regards,
Jeremy



More information about the wine-devel mailing list