Compare commits

...

13 Commits

Author SHA1 Message Date
falkTX 56c3e9da95
Prepare for 1.1.0 tagging
Signed-off-by: falkTX <falktx@falktx.com>
2022-02-18 15:24:51 +00:00
falkTX b845678722
Fix invalid logic when checking for valid pointers
Signed-off-by: falkTX <falktx@falktx.com>
2022-02-18 15:07:15 +00:00
falkTX 8dfb800644
Add /opt/wine-{stable,staging} to include paths
Fixes #28

Signed-off-by: falkTX <falktx@falktx.com>
2022-02-17 21:07:41 +00:00
falkTX 633c47ba61
Cleanup build rules
Fixes #32

Signed-off-by: falkTX <falktx@falktx.com>
2022-02-17 20:44:31 +00:00
falkTX 0919680d7a
Fix wrong architecture build for 32bit on 64bit systems
Signed-off-by: falkTX <falktx@falktx.com>
2022-01-12 05:28:22 +00:00
Filipe Coelho 35735b1f7d
Update README.md 2022-01-11 02:43:06 +00:00
Filipe Coelho eb7c6a1c35
Update README.md 2022-01-11 02:42:32 +00:00
KottV 144d4c0212 This fixes building on Open Build Server 2022-01-11 02:39:20 +00:00
praashie cc84b66df9 Respect channel numbers requested by host application 2022-01-03 12:03:46 +00:00
Daniel B. Hill 46dd59ba89 fix release builds
Signed-off-by: Daniel B. Hill <daniel@gluo.nz>
2022-01-03 12:01:29 +00:00
falkTX 4b4f68165f
Fix compatibility with Wine > 6.5
Signed-off-by: falkTX <falktx@falktx.com>
2021-11-24 21:19:25 +00:00
falkTX 0a97f2f9e2
Fix build under certain systems
Signed-off-by: falkTX <falktx@falktx.com>
2021-03-02 13:21:57 +00:00
praashie 4e4fc45e88 Fix misleading tooltip for "Fixed buffersize" 2020-12-06 20:22:42 +01:00
7 changed files with 106 additions and 44 deletions

View File

@ -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"

View File

@ -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 $@

View File

@ -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
View File

@ -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],

View File

@ -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
View File

@ -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} */

View File

@ -29,7 +29,9 @@
#include "winreg.h"
#include "objbase.h"
#ifdef DEBUG
#include "wine/debug.h"
#endif
/* WINE_DEFAULT_DEBUG_CHANNEL(asio); */