Compare commits
13 Commits
Author | SHA1 | Date |
---|---|---|
falkTX | 56c3e9da95 | |
falkTX | b845678722 | |
falkTX | 8dfb800644 | |
falkTX | 633c47ba61 | |
falkTX | 0919680d7a | |
Filipe Coelho | 35735b1f7d | |
Filipe Coelho | eb7c6a1c35 | |
KottV | 144d4c0212 | |
praashie | cc84b66df9 | |
Daniel B. Hill | 46dd59ba89 | |
falkTX | 4b4f68165f | |
falkTX | 0a97f2f9e2 | |
praashie | 4e4fc45e88 |
2
Makefile
2
Makefile
|
@ -4,7 +4,7 @@
|
|||
# Created by falkTX
|
||||
#
|
||||
|
||||
VERSION = 1.0.0
|
||||
VERSION = 1.1.0
|
||||
|
||||
all:
|
||||
@echo "error: you must pass '32' or '64' as an argument to this Makefile in order to build WineASIO"
|
||||
|
|
41
Makefile.mk
41
Makefile.mk
|
@ -12,14 +12,17 @@ ifeq ($(M),)
|
|||
$(error incorrect use of Makefile, M var is missing)
|
||||
endif
|
||||
|
||||
wineasio_dll_MODULE = wineasio.dll
|
||||
|
||||
PREFIX = /usr
|
||||
SRCDIR = .
|
||||
DLLS = wineasio.dll
|
||||
DLLS = $(wineasio_dll_MODULE) $(wineasio_dll_MODULE).so
|
||||
|
||||
### Tools
|
||||
|
||||
CC = gcc
|
||||
WINECC = winegcc
|
||||
CC = gcc
|
||||
WINEBUILD = winebuild
|
||||
WINECC = winegcc
|
||||
|
||||
### Common settings
|
||||
|
||||
|
@ -33,8 +36,10 @@ INCLUDE_PATH += -I$(PREFIX)/include/wine
|
|||
INCLUDE_PATH += -I$(PREFIX)/include/wine/windows
|
||||
INCLUDE_PATH += -I$(PREFIX)/include/wine-development
|
||||
INCLUDE_PATH += -I$(PREFIX)/include/wine-development/wine/windows
|
||||
DLL_PATH =
|
||||
LIBRARY_PATH =
|
||||
INCLUDE_PATH += -I/opt/wine-stable/include
|
||||
INCLUDE_PATH += -I/opt/wine-stable/include/wine/windows
|
||||
INCLUDE_PATH += -I/opt/wine-staging/include
|
||||
INCLUDE_PATH += -I/opt/wine-staging/include/wine/windows
|
||||
LIBRARIES = $(shell pkg-config --libs jack)
|
||||
|
||||
# 64bit build needs an extra flag
|
||||
|
@ -45,14 +50,12 @@ endif
|
|||
# Debug or Release
|
||||
ifeq ($(DEBUG),true)
|
||||
CEXTRA += -O0 -DDEBUG -g -D__WINESRC__
|
||||
LIBRARIES +=
|
||||
else
|
||||
CEXTRA += -O2 -DNDEBUG -fvisibility=hidden
|
||||
endif
|
||||
|
||||
### wineasio.dll sources and settings
|
||||
### wineasio.dll settings
|
||||
|
||||
wineasio_dll_MODULE = wineasio.dll
|
||||
wineasio_dll_C_SRCS = asio.c \
|
||||
main.c \
|
||||
regsvr.c
|
||||
|
@ -61,18 +64,21 @@ wineasio_dll_LDFLAGS = -shared \
|
|||
-mnocygwin \
|
||||
$(wineasio_dll_MODULE:%=%.spec) \
|
||||
-L/usr/lib$(M)/wine \
|
||||
-L/usr/lib/wine \
|
||||
-L/usr/lib/$(ARCH)-linux-gnu/wine \
|
||||
-L/usr/lib/$(ARCH)-linux-gnu/wine-development \
|
||||
-L/opt/wine-stable/lib \
|
||||
-L/opt/wine-stable/lib/wine \
|
||||
-L/opt/wine-stable/lib$(M) \
|
||||
-L/opt/wine-stable/lib$(M)/wine \
|
||||
-L/opt/wine-staging/lib \
|
||||
-L/opt/wine-staging/lib/wine \
|
||||
-L/opt/wine-staging/lib$(M) \
|
||||
-L/opt/wine-staging/lib$(M)/wine
|
||||
wineasio_dll_DLL_PATH =
|
||||
wineasio_dll_DLLS = odbc32 \
|
||||
ole32 \
|
||||
winmm
|
||||
wineasio_dll_LIBRARY_PATH=
|
||||
wineasio_dll_LIBRARIES= uuid
|
||||
wineasio_dll_LIBRARIES = uuid
|
||||
|
||||
wineasio_dll_OBJS = $(wineasio_dll_C_SRCS:%.c=build$(M)/%.c.o)
|
||||
|
||||
|
@ -83,7 +89,7 @@ C_SRCS = $(wineasio_dll_C_SRCS)
|
|||
### Generic targets
|
||||
|
||||
all:
|
||||
build: rtaudio/include/asio.h $(DLLS:%=build$(M)/%.so)
|
||||
build: rtaudio/include/asio.h $(DLLS:%=build$(M)/%)
|
||||
|
||||
### Build rules
|
||||
|
||||
|
@ -91,14 +97,15 @@ build: rtaudio/include/asio.h $(DLLS:%=build$(M)/%.so)
|
|||
|
||||
# Implicit rules
|
||||
|
||||
DEFINCL = $(INCLUDE_PATH) $(DEFINES) $(OPTIONS)
|
||||
|
||||
build$(M)/%.c.o: %.c
|
||||
@$(shell mkdir -p build$(M))
|
||||
$(CC) -c $(DEFINCL) $(CFLAGS) $(CEXTRA) -o $@ $<
|
||||
$(CC) -c $(INCLUDE_PATH) $(CFLAGS) $(CEXTRA) -o $@ $<
|
||||
|
||||
### Target specific build rules
|
||||
DEFLIB = $(LIBRARY_PATH) $(LIBRARIES) $(DLL_PATH)
|
||||
|
||||
build$(M)/$(wineasio_dll_MODULE): $(wineasio_dll_OBJS)
|
||||
$(WINEBUILD) -m$(M) --dll --fake-module -E $(wineasio_dll_MODULE).spec $^ -o $@
|
||||
|
||||
build$(M)/$(wineasio_dll_MODULE).so: $(wineasio_dll_OBJS)
|
||||
$(WINECC) $(wineasio_dll_LDFLAGS) -o $@ $(wineasio_dll_OBJS) $(wineasio_dll_LIBRARY_PATH) $(DEFLIB) $(wineasio_dll_DLLS:%=-l%) $(wineasio_dll_LIBRARIES:%=-l%)
|
||||
$(WINECC) $^ $(wineasio_dll_LDFLAGS) $(LIBRARIES) \
|
||||
$(wineasio_dll_DLLS:%=-l%) $(wineasio_dll_LIBRARIES:%=-l%) -o $@
|
||||
|
|
58
README.md
58
README.md
|
@ -18,22 +18,24 @@ Do the following to build for 32-bit Wine.
|
|||
make 32
|
||||
```
|
||||
|
||||
To install (substitute with the path to the 32-bit wine libs for your distro).
|
||||
|
||||
```sh
|
||||
sudo cp build32/wineasio.dll.so /usr/lib/i386-linux-gnu/wine/wineasio.dll.so
|
||||
```
|
||||
|
||||
Do the following to build for 64-bit Wine.
|
||||
|
||||
```sh
|
||||
make 64
|
||||
```
|
||||
|
||||
To install (substitute with the path to the 64-bit wine libs for your distro).
|
||||
#### LEGACY WINE
|
||||
|
||||
To install on 32bit wine <= 6.5 (substitute with the path to the 32-bit wine libs for your distro).
|
||||
|
||||
```sh
|
||||
sudo cp build64/wineasio.dll.so /usr/lib/x86_64-linux-gnu/wine/wineasio.dll.so
|
||||
sudo cp build32/wineasio.dll.so /usr/lib/i386-linux-gnu/wine/wineasio.dll.so
|
||||
```
|
||||
|
||||
To install on 64bit wine <= 6.5 (substitute with the path to the 64-bit wine libs for your distro).
|
||||
|
||||
```sh
|
||||
sudo cp build64/wineasio.dll.so /usr/lib/x86_64-linux-gnu/wine/wineasio.dll.so
|
||||
```
|
||||
|
||||
Finally the dll must be registered in the wineprefix.
|
||||
|
@ -52,6 +54,42 @@ use the following command to register the 64-bit driver in a 64-bit wineprefix:
|
|||
wine64 regsvr32 wineasio.dll
|
||||
```
|
||||
|
||||
#### WINE > 6.5
|
||||
|
||||
To install on 32bit wine > 6.5 (substitute with the path to the 32-bit wine libs for your distro).
|
||||
|
||||
```sh
|
||||
sudo cp build32/wineasio.dll /usr/lib/i386-linux-gnu/wine/i386-windows/wineasio.dll
|
||||
sudo cp build32/wineasio.dll.so /usr/lib/i386-linux-gnu/wine/i386-unix/wineasio.dll.so
|
||||
```
|
||||
|
||||
To install on 64bit wine > 6.5 (substitute with the path to the 64-bit wine libs for your distro).
|
||||
|
||||
```sh
|
||||
sudo cp build64/wineasio.dll /usr/lib/x86_64-linux-gnu/wine/x86_64-windows/wineasio.dll
|
||||
sudo cp build64/wineasio.dll.so /usr/lib/x86_64-linux-gnu/wine/x86_64-unix/wineasio.dll.so
|
||||
```
|
||||
|
||||
Finally the dll must be registered in the wineprefix.
|
||||
For both 32 and 64-bit wine do:
|
||||
(substitute with the path to the 32-bit wine libs for your distro)
|
||||
|
||||
```sh
|
||||
regsvr32 /usr/lib/i386-linux-gnu/wine/i386-windows/wineasio.dll
|
||||
|
||||
```
|
||||
|
||||
On a 64-bit system with wine supporting both 32 and 64-bit applications,
|
||||
regsrv32 will register the 32-bit driver in a 64-bit prefix,
|
||||
use the following command to register the 64-bit driver in a 64-bit wineprefix:
|
||||
(substitute with the path to the 64-bit wine libs for your distro)
|
||||
|
||||
```sh
|
||||
wine64 regsvr32 /usr/lib/x86_64-linux-gnu/wine/x86_64-windows/wineasio.dll
|
||||
```
|
||||
|
||||
#### CUSTOM WINEPREFIX
|
||||
|
||||
regsvr32 registers the ASIO COM object in the default prefix `~/.wine`.
|
||||
To use another prefix specify it explicitly, like:
|
||||
|
||||
|
@ -110,6 +148,10 @@ that overrides the JACK client name derived from the program name.
|
|||
|
||||
### CHANGE LOG
|
||||
|
||||
#### 1.1.0
|
||||
* 18-FEB-2022: Various bug fixes (falkTX)
|
||||
* 24-NOV-2021: Fix compatibility with Wine > 6.5
|
||||
|
||||
#### 1.0.0
|
||||
* 14-JUL-2020: Add packaging script
|
||||
* 12-MAR-2020: Fix control panel startup
|
||||
|
|
40
asio.c
40
asio.c
|
@ -645,7 +645,7 @@ HIDDEN ASIOError STDMETHODCALLTYPE GetChannels (LPWINEASIO iface, LONG *numInput
|
|||
{
|
||||
IWineASIOImpl *This = (IWineASIOImpl*)iface;
|
||||
|
||||
if (!numInputChannels && !numOutputChannels)
|
||||
if (!numInputChannels || !numOutputChannels)
|
||||
return ASE_InvalidParameter;
|
||||
|
||||
*numInputChannels = This->wineasio_number_inputs;
|
||||
|
@ -665,8 +665,8 @@ HIDDEN ASIOError STDMETHODCALLTYPE GetLatencies(LPWINEASIO iface, LONG *inputLat
|
|||
{
|
||||
IWineASIOImpl *This = (IWineASIOImpl*)iface;
|
||||
jack_latency_range_t range;
|
||||
|
||||
if (!inputLatency && !outputLatency)
|
||||
|
||||
if (!inputLatency || !outputLatency)
|
||||
return ASE_InvalidParameter;
|
||||
|
||||
if (This->asio_driver_state == Loaded)
|
||||
|
@ -695,7 +695,7 @@ HIDDEN ASIOError STDMETHODCALLTYPE GetBufferSize(LPWINEASIO iface, LONG *minSize
|
|||
|
||||
TRACE("iface: %p, minSize: %p, maxSize: %p, preferredSize: %p, granularity: %p\n", iface, minSize, maxSize, preferredSize, granularity);
|
||||
|
||||
if (!minSize && !maxSize && !preferredSize && !granularity)
|
||||
if (!minSize || !maxSize || !preferredSize || !granularity)
|
||||
return ASE_InvalidParameter;
|
||||
|
||||
if (This->wineasio_fixed_buffersize)
|
||||
|
@ -788,7 +788,7 @@ HIDDEN ASIOError STDMETHODCALLTYPE GetClockSources(LPWINEASIO iface, ASIOClockSo
|
|||
{
|
||||
TRACE("iface: %p, clocks: %p, numSources: %p\n", iface, clocks, numSources);
|
||||
|
||||
if (!clocks && !numSources)
|
||||
if (!clocks || !numSources)
|
||||
return ASE_InvalidParameter;
|
||||
|
||||
clocks->index = 0;
|
||||
|
@ -835,7 +835,7 @@ HIDDEN ASIOError STDMETHODCALLTYPE GetSamplePosition(LPWINEASIO iface, ASIOSampl
|
|||
|
||||
TRACE("iface: %p, sPos: %p, tStamp: %p\n", iface, sPos, tStamp);
|
||||
|
||||
if (!sPos && !tStamp)
|
||||
if (!sPos || !tStamp)
|
||||
return ASE_InvalidParameter;
|
||||
|
||||
tStamp->lo = This->asio_time_stamp.lo;
|
||||
|
@ -903,8 +903,8 @@ HIDDEN ASIOError STDMETHODCALLTYPE CreateBuffers(LPWINEASIO iface, ASIOBufferInf
|
|||
if (This->asio_driver_state != Initialized)
|
||||
return ASE_NotPresent;
|
||||
|
||||
if (!bufferInfo && !asioCallbacks)
|
||||
return ASE_InvalidMode;
|
||||
if (!bufferInfo || !asioCallbacks)
|
||||
return ASE_InvalidMode;
|
||||
|
||||
/* Check for invalid channel numbers */
|
||||
for (i = j = k = 0; i < numChannels; i++, buffer_info++)
|
||||
|
@ -1010,21 +1010,29 @@ HIDDEN ASIOError STDMETHODCALLTYPE CreateBuffers(LPWINEASIO iface, ASIOBufferInf
|
|||
/* initialize ASIOBufferInfo structures */
|
||||
buffer_info = bufferInfo;
|
||||
This->asio_active_inputs = This->asio_active_outputs = 0;
|
||||
|
||||
for (i = 0; i < This->wineasio_number_inputs; i++) {
|
||||
This->input_channel[i].active = ASIOFalse;
|
||||
}
|
||||
for (i = 0; i < This->wineasio_number_outputs; i++) {
|
||||
This->output_channel[i].active = ASIOFalse;
|
||||
}
|
||||
|
||||
for (i = 0; i < numChannels; i++, buffer_info++)
|
||||
{
|
||||
if (buffer_info->isInput)
|
||||
{
|
||||
buffer_info->buffers[0] = &This->input_channel[This->asio_active_inputs].audio_buffer[0];
|
||||
buffer_info->buffers[1] = &This->input_channel[This->asio_active_inputs].audio_buffer[This->asio_current_buffersize];
|
||||
This->input_channel[This->asio_active_inputs].active = ASIOTrue;
|
||||
buffer_info->buffers[0] = &This->input_channel[buffer_info->channelNum].audio_buffer[0];
|
||||
buffer_info->buffers[1] = &This->input_channel[buffer_info->channelNum].audio_buffer[This->asio_current_buffersize];
|
||||
This->input_channel[buffer_info->channelNum].active = ASIOTrue;
|
||||
This->asio_active_inputs++;
|
||||
/* TRACE("ASIO audio buffer for channel %i as input %li created\n", i, This->asio_active_inputs); */
|
||||
}
|
||||
else
|
||||
{
|
||||
buffer_info->buffers[0] = &This->output_channel[This->asio_active_outputs].audio_buffer[0];
|
||||
buffer_info->buffers[1] = &This->output_channel[This->asio_active_outputs].audio_buffer[This->asio_current_buffersize];
|
||||
This->output_channel[This->asio_active_outputs].active = ASIOTrue;
|
||||
buffer_info->buffers[0] = &This->output_channel[buffer_info->channelNum].audio_buffer[0];
|
||||
buffer_info->buffers[1] = &This->output_channel[buffer_info->channelNum].audio_buffer[This->asio_current_buffersize];
|
||||
This->output_channel[buffer_info->channelNum].active = ASIOTrue;
|
||||
This->asio_active_outputs++;
|
||||
/* TRACE("ASIO audio buffer for channel %i as output %li created\n", i, This->asio_active_outputs); */
|
||||
}
|
||||
|
@ -1262,7 +1270,7 @@ static inline int jack_process_callback(jack_nframes_t nframes, void *arg)
|
|||
}
|
||||
|
||||
/* copy jack to asio buffers */
|
||||
for (i = 0; i < This->asio_active_inputs; i++)
|
||||
for (i = 0; i < This->wineasio_number_inputs; i++)
|
||||
if (This->input_channel[i].active == ASIOTrue)
|
||||
memcpy (&This->input_channel[i].audio_buffer[nframes * This->asio_buffer_index],
|
||||
jack_port_get_buffer(This->input_channel[i].port, nframes),
|
||||
|
@ -1300,7 +1308,7 @@ static inline int jack_process_callback(jack_nframes_t nframes, void *arg)
|
|||
}
|
||||
|
||||
/* copy asio to jack buffers */
|
||||
for (i = 0; i < This->asio_active_outputs; i++)
|
||||
for (i = 0; i < This->wineasio_number_outputs; i++)
|
||||
if (This->output_channel[i].active == ASIOTrue)
|
||||
memcpy(jack_port_get_buffer(This->output_channel[i].port, nframes),
|
||||
&This->output_channel[i].audio_buffer[nframes * This->asio_buffer_index],
|
||||
|
|
|
@ -155,8 +155,9 @@ class Ui_WineASIOSettings(object):
|
|||
|
||||
self.cb_jack_fixed_bsize.setText(_tr(self.OBJECT_NAME, "Fixed buffersize"))
|
||||
self.cb_jack_fixed_bsize.setToolTip(_tr(self.OBJECT_NAME,
|
||||
"When on, an asio app will be able to change the jack buffer size.\n"
|
||||
"Default is off"))
|
||||
"When on: ASIO applications will respect the current JACK buffer size\n"
|
||||
"When off: ASIO applications can change the JACK buffer size"
|
||||
"Default is on"))
|
||||
|
||||
self.label_jack_buffer_size.setText(_tr(self.OBJECT_NAME, "Preferred buffersize:"))
|
||||
|
||||
|
|
2
main.c
2
main.c
|
@ -24,7 +24,9 @@
|
|||
#include "winreg.h"
|
||||
#include "objbase.h"
|
||||
|
||||
#ifdef DEBUG
|
||||
#include "wine/debug.h"
|
||||
#endif
|
||||
/* WINE_DEFAULT_DEBUG_CHANNEL(asio); */
|
||||
|
||||
/* {48D0C522-BFCC-45cc-8B84-17F25F33E6E8} */
|
||||
|
|
Loading…
Reference in New Issue