Open OfficialIncubo opened 2 years ago
I've tried it with both Wine and Crossover on Mac (14.0) but doesn't work unfortunately. Probably something to do with the audio input. Here are my logs in case it helps someone:
➜ wine MilkDrop3/MilkDrop\ 3.exe
007c:fixme:hid:handle_IRP_MN_QUERY_ID Unhandled type 00000005
007c:fixme:hid:handle_IRP_MN_QUERY_ID Unhandled type 00000005
007c:fixme:hid:handle_IRP_MN_QUERY_ID Unhandled type 00000005
007c:fixme:hid:handle_IRP_MN_QUERY_ID Unhandled type 00000005
0024:err:environ:init_peb starting L"Z:\\Users\\adb\\Desktop\\MilkDrop3\\MilkDrop 3.exe" in experimental wow64 mode
0024:fixme:bitmap:NtGdiCreateBitmap planes = 0
0024:fixme:bitmap:NtGdiCreateBitmap planes = 0
0024:fixme:thread:get_thread_times not implemented on this platform
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0x190
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0x190
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0x190
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0x190
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0x190
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0x190
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0x190
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0x190
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0x190
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0x190
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0108:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0108:fixme:coreaudio:ca_channel_layout_to_channel_mask Unhandled channel 0xffffffff
0024:fixme:kernelbase:AppPolicyGetProcessTerminationMethod FFFFFFFA, 0012FEAC
Same happened with my Exagear. I have no clue.....
I think Wine doesn't support loopback-capture or WASAPI.
Suddenly, @gth001 posted a comment that Milkdrop3 worked with Parallels Desktop! Can you try this? If it works, then I can close this issue. That's it.
https://github.com/milkdrop2077/MilkDrop3/issues/29#issuecomment-1849267918
Wine supports whatever capture/playback devices are provded by the host OS. The issue on macOS is rather that CoreAudio doesn't support looback capture at all, it can only capture from external input sources like webcams, line-in and microphones. There are some commercial kernel-level drivers which add "virtual loopback cables" to capture application output and make it available as a virtual line-in adapter. That said, on a standard macOS device, you're just out of luck, we have the exact same issue with projectM.
If you really want to do a native port, you'd have to replace all Win32-specific code with the respective macOS pendants, like:
You'd end up with similar issues regarding the preset shaders as we have in projectM as Metal doesn't understand HLSL, but uses the MSL, the Metal Shading Language, which is even different from GLSL.
You are free to PR. Any help is appreciated! :)
Not an easy task, especially given the decades-old code in the original Milkdrop. Main issue will be the shader translation, which we had lots of fun with in projectM. There are libraries which can do this like niceshade, but I guess none of these will be able to properly translate the undocumented quirks existing in DirectX/HLSL which preset authors inadvertently rely on in many presets. Some HLSL math functions do not return NaN
for invalid inputs as documented, but some other result. For example, pow()
with a negative base and a fractional exponent should return NaN
as this operation is undefined within real numbers, but it actually returns the result as if the base was positive, e.g. taking its absolute value.
Other shading languages behave properly, but break those presets, resulting in (partially) black images. We've added some special treatments in our shader translator to a few functions we could identify and guessed how they actually behave, fixing most of these issues. Not sure how easy this will be with a third-party translator.
All in all, even with Wine or any other compatibility layer, I'd guess those presets will all look bad unless there's a generic way to fix the issue. We can't fix the presets as they're user-supplied, so this has to be part of the "player". Not really great, but that's what you get if some API designer (Microsoft/HLSL in this case) doesn't stick to their own documentation. Can't even blame the preset authors, as they'll just work by trial and error. If it looks okay, most of them won't get deep into the shader math to see if they ended up with some invalid inputs. But if the presets don't render properly, the users will blame us as the authors of Milkdrop renderers for not being thorough enough.
The BeatDrop Music Visualizer is only supported for Windows. I am waiting for porting this visualizer for MacOS, so it should be working.
So, anyone can try to google ".exe to MacOS" or "Windows app to MacOS", or I just try myself.