Signed-off-by: Huw Davies <huw(a)codeweavers.com>
---
dlls/wineoss.drv/mmdevdrv.c | 35 ++++++-----------------------------
dlls/wineoss.drv/oss.c | 35 +++++++++++++++++++++++++++++++++++
dlls/wineoss.drv/unixlib.h | 31 ++++++++++---------------------
3 files changed, 51 insertions(+), 50 deletions(-)
diff --git a/dlls/wineoss.drv/mmdevdrv.c b/dlls/wineoss.drv/mmdevdrv.c
index cdd9b09bff7..9e3380ca8d9 100644
--- a/dlls/wineoss.drv/mmdevdrv.c
+++ b/dlls/wineoss.drv/mmdevdrv.c
@@ -18,22 +18,7 @@
*/
#define COBJMACROS
-#include "config.h"
-
#include <stdarg.h>
-#include <errno.h>
-#include <limits.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/ioctl.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <math.h>
-#include <sys/soundcard.h>
-#include <pthread.h>
#include "windef.h"
#include "winbase.h"
@@ -277,16 +262,6 @@ static DWORD WINAPI timer_thread(void *user)
return 0;
}
-static void oss_lock(struct oss_stream *stream)
-{
- pthread_mutex_lock(&stream->lock);
-}
-
-static void oss_unlock(struct oss_stream *stream)
-{
- pthread_mutex_unlock(&stream->lock);
-}
-
static void set_device_guid(EDataFlow flow, HKEY drv_key, const WCHAR *key_name,
GUID *guid)
{
@@ -361,11 +336,13 @@ static void get_device_guid(EDataFlow flow, const char *device, GUID *guid)
static void set_stream_volumes(ACImpl *This)
{
- struct oss_stream *stream = This->stream;
+ struct set_volumes_params params;
- oss_lock(stream);
- stream->mute = This->session->mute;
- oss_unlock(stream);
+ params.stream = This->stream;
+ params.master_volume = (This->session->mute ? 0.0f : This->session->master_vol);
+ params.volumes = This->vols;
+ params.session_volumes = This->session->channel_vols;
+ OSS_CALL(set_volumes, ¶ms);
}
static const OSSDevice *get_ossdevice_from_guid(const GUID *guid)
diff --git a/dlls/wineoss.drv/oss.c b/dlls/wineoss.drv/oss.c
index 79f2e994d89..b4e2cbda704 100644
--- a/dlls/wineoss.drv/oss.c
+++ b/dlls/wineoss.drv/oss.c
@@ -44,6 +44,28 @@
#include "unixlib.h"
+struct oss_stream
+{
+ WAVEFORMATEX *fmt;
+ EDataFlow flow;
+ UINT flags;
+ AUDCLNT_SHAREMODE share;
+ HANDLE event;
+
+ int fd;
+
+ BOOL playing, mute, please_quit;
+ UINT64 written_frames, last_pos_frames;
+ UINT32 period_frames, bufsize_frames, held_frames, tmp_buffer_frames, in_oss_frames;
+ UINT32 oss_bufsize_bytes, lcl_offs_frames; /* offs into local_buffer where valid data starts */
+ REFERENCE_TIME period;
+
+ BYTE *local_buffer, *tmp_buffer;
+ INT32 getbuf_last; /* <0 when using tmp_buffer */
+
+ pthread_mutex_t lock;
+};
+
WINE_DEFAULT_DEBUG_CHANNEL(oss);
/* copied from kernelbase */
@@ -1316,6 +1338,18 @@ static NTSTATUS get_position(void *args)
return oss_unlock_result(stream, ¶ms->result, S_OK);
}
+static NTSTATUS set_volumes(void *args)
+{
+ struct set_volumes_params *params = args;
+ struct oss_stream *stream = params->stream;
+
+ oss_lock(stream);
+ stream->mute = !params->master_volume;
+ oss_unlock(stream);
+
+ return STATUS_SUCCESS;
+}
+
static NTSTATUS set_event_handle(void *args)
{
struct set_event_handle_params *params = args;
@@ -1368,6 +1402,7 @@ unixlib_entry_t __wine_unix_call_funcs[] =
get_next_packet_size,
get_frequency,
get_position,
+ set_volumes,
set_event_handle,
is_started,
};
diff --git a/dlls/wineoss.drv/unixlib.h b/dlls/wineoss.drv/unixlib.h
index ed93f0836b1..1ed152fe794 100644
--- a/dlls/wineoss.drv/unixlib.h
+++ b/dlls/wineoss.drv/unixlib.h
@@ -18,27 +18,7 @@
#include "mmdeviceapi.h"
-struct oss_stream
-{
- WAVEFORMATEX *fmt;
- EDataFlow flow;
- UINT flags;
- AUDCLNT_SHAREMODE share;
- HANDLE event;
-
- int fd;
-
- BOOL playing, mute, please_quit;
- UINT64 written_frames, last_pos_frames;
- UINT32 period_frames, bufsize_frames, held_frames, tmp_buffer_frames, in_oss_frames;
- UINT32 oss_bufsize_bytes, lcl_offs_frames; /* offs into local_buffer where valid data starts */
- REFERENCE_TIME period;
-
- BYTE *local_buffer, *tmp_buffer;
- INT32 getbuf_last; /* <0 when using tmp_buffer */
-
- pthread_mutex_t lock;
-};
+struct stream_oss;
/* From <dlls/mmdevapi/mmdevapi.h> */
enum DriverPriority
@@ -208,6 +188,14 @@ struct get_position_params
UINT64 *qpctime;
};
+struct set_volumes_params
+{
+ struct oss_stream *stream;
+ float master_volume;
+ const float *volumes;
+ const float *session_volumes;
+};
+
struct set_event_handle_params
{
struct oss_stream *stream;
@@ -243,6 +231,7 @@ enum oss_funcs
oss_get_next_packet_size,
oss_get_frequency,
oss_get_position,
+ oss_set_volumes,
oss_set_event_handle,
oss_is_started,
};
--
2.25.1