asio: Add support for MinGW build

Drop MSVC specific bits and remove unused dependency

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6404>
This commit is contained in:
Seungha Yang 2024-03-19 23:37:37 +09:00 committed by GStreamer Marge Bot
parent f0761a7358
commit 17f92ab400
7 changed files with 43 additions and 59 deletions

View file

@ -24,7 +24,6 @@
#include "gstasiodeviceprovider.h" #include "gstasiodeviceprovider.h"
#include "gstasioutils.h" #include "gstasioutils.h"
#include "gstasioobject.h" #include "gstasioobject.h"
#include <atlconv.h>
enum enum
{ {
@ -165,8 +164,6 @@ gst_asio_device_provider_probe_internal (GstAsioDeviceProvider * self,
const gchar *device_class, *factory_name; const gchar *device_class, *factory_name;
GList *iter; GList *iter;
USES_CONVERSION;
if (is_src) { if (is_src) {
device_class = "Audio/Source"; device_class = "Audio/Source";
factory_name = "asiosrc"; factory_name = "asiosrc";
@ -189,6 +186,7 @@ gst_asio_device_provider_probe_internal (GstAsioDeviceProvider * self,
glong max_buf_size = 0; glong max_buf_size = 0;
glong preferred_buf_size = 0; glong preferred_buf_size = 0;
glong buf_size_granularity = 0; glong buf_size_granularity = 0;
gchar *clsid_str_utf8;
obj = gst_asio_object_new (info, FALSE); obj = gst_asio_object_new (info, FALSE);
if (!obj) if (!obj)
@ -220,9 +218,12 @@ gst_asio_device_provider_probe_internal (GstAsioDeviceProvider * self,
&preferred_buf_size, &buf_size_granularity)) &preferred_buf_size, &buf_size_granularity))
goto done; goto done;
clsid_str_utf8 = g_utf16_to_utf8 ((const gunichar2 *) clsid_str, -1,
nullptr, nullptr, nullptr);
props = gst_structure_new ("asio-proplist", props = gst_structure_new ("asio-proplist",
"device.api", G_TYPE_STRING, "asio", "device.api", G_TYPE_STRING, "asio",
"device.clsid", G_TYPE_STRING, OLE2A (clsid_str), "device.clsid", G_TYPE_STRING, clsid_str_utf8,
"asio.device.description", G_TYPE_STRING, info->driver_desc, "asio.device.description", G_TYPE_STRING, info->driver_desc,
"asio.device.min-buf-size", G_TYPE_LONG, min_buf_size, "asio.device.min-buf-size", G_TYPE_LONG, min_buf_size,
"asio.device.max-buf-size", G_TYPE_LONG, max_buf_size, "asio.device.max-buf-size", G_TYPE_LONG, max_buf_size,
@ -231,14 +232,18 @@ gst_asio_device_provider_probe_internal (GstAsioDeviceProvider * self,
nullptr); nullptr);
device = (GstDevice *) g_object_new (GST_TYPE_ASIO_DEVICE, device = (GstDevice *) g_object_new (GST_TYPE_ASIO_DEVICE,
"device-clsid", OLE2A (clsid_str), "device-clsid", clsid_str_utf8,
"display-name", info->driver_desc, "caps", caps, "display-name", info->driver_desc, "caps", caps,
"device-class", device_class, "properties", props, nullptr); "device-class", device_class, "properties", props, nullptr);
GST_ASIO_DEVICE (device)->factory_name = factory_name; GST_ASIO_DEVICE (device)->factory_name = factory_name;
g_free (clsid_str_utf8);
*devices = g_list_append (*devices, device); *devices = g_list_append (*devices, device);
done: done:
if (clsid_str)
CoTaskMemFree (clsid_str);
gst_clear_caps (&caps); gst_clear_caps (&caps);
gst_clear_object (&obj); gst_clear_object (&obj);
if (props) if (props)

View file

@ -959,7 +959,7 @@ gst_asio_object_get_caps (GstAsioObject * obj, GstAsioDeviceClassType type,
/* max_num_channels == 0 means [1, max-allowed-channles] */ /* max_num_channels == 0 means [1, max-allowed-channles] */
if (max_num_channels > 0) { if (max_num_channels > 0) {
if (max_num_channels > obj->max_num_input_channels) { if (max_num_channels > (guint) obj->max_num_input_channels) {
GST_WARNING_OBJECT (obj, "Too many max channels"); GST_WARNING_OBJECT (obj, "Too many max channels");
return nullptr; return nullptr;
} }
@ -968,7 +968,7 @@ gst_asio_object_get_caps (GstAsioObject * obj, GstAsioDeviceClassType type,
} }
if (min_num_channels > 0) { if (min_num_channels > 0) {
if (min_num_channels > obj->max_num_input_channels) { if (min_num_channels > (guint) obj->max_num_input_channels) {
GST_WARNING_OBJECT (obj, "Too many min channels"); GST_WARNING_OBJECT (obj, "Too many min channels");
return nullptr; return nullptr;
} }
@ -985,7 +985,7 @@ gst_asio_object_get_caps (GstAsioObject * obj, GstAsioDeviceClassType type,
/* max_num_channels == 0 means [1, max-allowed-channles] */ /* max_num_channels == 0 means [1, max-allowed-channles] */
if (max_num_channels > 0) { if (max_num_channels > 0) {
if (max_num_channels > obj->max_num_output_channels) { if (max_num_channels > (guint) obj->max_num_output_channels) {
GST_WARNING_OBJECT (obj, "Too many max channels"); GST_WARNING_OBJECT (obj, "Too many max channels");
return nullptr; return nullptr;
} }
@ -994,7 +994,7 @@ gst_asio_object_get_caps (GstAsioObject * obj, GstAsioDeviceClassType type,
} }
if (min_num_channels > 0) { if (min_num_channels > 0) {
if (min_num_channels > obj->max_num_output_channels) { if (min_num_channels > (guint) obj->max_num_output_channels) {
GST_WARNING_OBJECT (obj, "Too many min channels"); GST_WARNING_OBJECT (obj, "Too many min channels");
return nullptr; return nullptr;
} }
@ -1094,7 +1094,7 @@ gst_asio_object_validate_channels (GstAsioObject * self, gboolean is_input,
guint * channel_indices, guint num_channels) guint * channel_indices, guint num_channels)
{ {
if (is_input) { if (is_input) {
if (self->max_num_input_channels < num_channels) { if ((guint) self->max_num_input_channels < num_channels) {
GST_WARNING_OBJECT (self, "%d exceeds max input channels %ld", GST_WARNING_OBJECT (self, "%d exceeds max input channels %ld",
num_channels, self->max_num_input_channels); num_channels, self->max_num_input_channels);
return FALSE; return FALSE;
@ -1102,7 +1102,7 @@ gst_asio_object_validate_channels (GstAsioObject * self, gboolean is_input,
for (guint i = 0; i < num_channels; i++) { for (guint i = 0; i < num_channels; i++) {
guint ch = channel_indices[i]; guint ch = channel_indices[i];
if (self->max_num_input_channels <= ch) { if ((guint) self->max_num_input_channels <= ch) {
GST_WARNING_OBJECT (self, "%d exceeds max input channels %ld", GST_WARNING_OBJECT (self, "%d exceeds max input channels %ld",
ch, self->max_num_input_channels); ch, self->max_num_input_channels);
@ -1110,7 +1110,7 @@ gst_asio_object_validate_channels (GstAsioObject * self, gboolean is_input,
} }
} }
} else { } else {
if (self->max_num_output_channels < num_channels) { if ((guint) self->max_num_output_channels < num_channels) {
GST_WARNING_OBJECT (self, "%d exceeds max output channels %ld", GST_WARNING_OBJECT (self, "%d exceeds max output channels %ld",
num_channels, self->max_num_output_channels); num_channels, self->max_num_output_channels);
@ -1119,7 +1119,7 @@ gst_asio_object_validate_channels (GstAsioObject * self, gboolean is_input,
for (guint i = 0; i < num_channels; i++) { for (guint i = 0; i < num_channels; i++) {
guint ch = channel_indices[i]; guint ch = channel_indices[i];
if (self->max_num_output_channels <= ch) { if ((guint) self->max_num_output_channels <= ch) {
GST_WARNING_OBJECT (self, "%d exceeds max output channels %ld", GST_WARNING_OBJECT (self, "%d exceeds max output channels %ld",
ch, self->max_num_output_channels); ch, self->max_num_output_channels);
@ -1147,7 +1147,7 @@ gst_asio_object_check_buffer_reuse (GstAsioObject * self, ASIOBool is_input,
continue; continue;
for (guint j = 0; j < num_channels; j++) { for (guint j = 0; j < num_channels; j++) {
if (info->channelNum == channel_indices[j]) { if ((guint) info->channelNum == channel_indices[j]) {
num_found++; num_found++;
break; break;
@ -1347,7 +1347,7 @@ gst_asio_object_create_buffers (GstAsioObject * obj,
} }
obj->num_requested_input_channels = 0; obj->num_requested_input_channels = 0;
for (guint i = 0; i < obj->max_num_input_channels; i++) { for (guint i = 0; i < (guint) obj->max_num_input_channels; i++) {
if (obj->input_channel_requested[i]) if (obj->input_channel_requested[i])
obj->num_requested_input_channels++; obj->num_requested_input_channels++;
} }
@ -1359,7 +1359,7 @@ gst_asio_object_create_buffers (GstAsioObject * obj,
} }
obj->num_requested_output_channels = 0; obj->num_requested_output_channels = 0;
for (guint i = 0; i < obj->max_num_output_channels; i++) { for (guint i = 0; i < (guint) obj->max_num_output_channels; i++) {
if (obj->output_channel_requested[i]) if (obj->output_channel_requested[i])
obj->num_requested_output_channels++; obj->num_requested_output_channels++;
} }
@ -1370,7 +1370,7 @@ gst_asio_object_create_buffers (GstAsioObject * obj,
obj->num_requested_output_channels; obj->num_requested_output_channels;
obj->buffer_infos = g_new0 (ASIOBufferInfo, obj->num_allocated_buffers); obj->buffer_infos = g_new0 (ASIOBufferInfo, obj->num_allocated_buffers);
for (i = 0, j = 0; i < obj->num_requested_input_channels; i++) { for (i = 0, j = 0; i < (guint) obj->num_requested_input_channels; i++) {
ASIOBufferInfo *info = &obj->buffer_infos[i]; ASIOBufferInfo *info = &obj->buffer_infos[i];
info->isInput = TRUE; info->isInput = TRUE;
@ -1382,7 +1382,7 @@ gst_asio_object_create_buffers (GstAsioObject * obj,
} }
for (i = obj->num_requested_input_channels, j = 0; for (i = obj->num_requested_input_channels, j = 0;
i < i < (guint)
obj->num_requested_input_channels + obj->num_requested_output_channels; obj->num_requested_input_channels + obj->num_requested_output_channels;
i++) { i++) {
ASIOBufferInfo *info = &obj->buffer_infos[i]; ASIOBufferInfo *info = &obj->buffer_infos[i];

View file

@ -70,12 +70,6 @@ static gboolean gst_asio_ring_buffer_start (GstAudioRingBuffer * buf);
static gboolean gst_asio_ring_buffer_stop (GstAudioRingBuffer * buf); static gboolean gst_asio_ring_buffer_stop (GstAudioRingBuffer * buf);
static guint gst_asio_ring_buffer_delay (GstAudioRingBuffer * buf); static guint gst_asio_ring_buffer_delay (GstAudioRingBuffer * buf);
static gboolean gst_asio_buffer_switch_cb (GstAsioObject * obj,
glong index, ASIOBufferInfo * infos, guint num_infos,
ASIOChannelInfo * input_channel_infos,
ASIOChannelInfo * output_channel_infos,
ASIOSampleRate sample_rate, glong buffer_size, gpointer user_data);
#define gst_asio_ring_buffer_parent_class parent_class #define gst_asio_ring_buffer_parent_class parent_class
G_DEFINE_TYPE (GstAsioRingBuffer, gst_asio_ring_buffer, G_DEFINE_TYPE (GstAsioRingBuffer, gst_asio_ring_buffer,
GST_TYPE_AUDIO_RING_BUFFER); GST_TYPE_AUDIO_RING_BUFFER);
@ -196,7 +190,8 @@ gst_asio_buffer_switch_cb (GstAsioObject * obj, glong index,
guint64 gap_frames = sample_position - self->expected_sample_position; guint64 gap_frames = sample_position - self->expected_sample_position;
gint gap_size = gap_frames * bps; gint gap_size = gap_frames * bps;
GST_WARNING_OBJECT (self, "%" G_GUINT64_FORMAT " frames are missing"); GST_WARNING_OBJECT (self, "%" G_GUINT64_FORMAT " frames are missing",
gap_frames);
while (gap_size >= len) { while (gap_size >= len) {
gst_audio_format_info_fill_silence (ringbuffer->spec.info.finfo, gst_audio_format_info_fill_silence (ringbuffer->spec.info.finfo,
@ -232,7 +227,7 @@ gst_asio_buffer_switch_cb (GstAsioObject * obj, glong index,
} }
for (j = 0; j < self->num_channels; j++) { for (j = 0; j < self->num_channels; j++) {
if (self->channel_indices[j] != info->channelNum) if (self->channel_indices[j] != (guint) info->channelNum)
continue; continue;
g_assert (num_channels < self->num_channels); g_assert (num_channels < self->num_channels);
@ -253,7 +248,7 @@ gst_asio_buffer_switch_cb (GstAsioObject * obj, glong index,
guint gst_offset = 0, asio_offset = 0; guint gst_offset = 0, asio_offset = 0;
/* Interleaves audio */ /* Interleaves audio */
while (gst_offset < len) { while (gst_offset < (guint) len) {
for (i = 0; i < num_channels; i++) { for (i = 0; i < num_channels; i++) {
ASIOBufferInfo *info = self->infos[i]; ASIOBufferInfo *info = self->infos[i];
@ -272,7 +267,7 @@ gst_asio_buffer_switch_cb (GstAsioObject * obj, glong index,
guint gst_offset = 0, asio_offset = 0; guint gst_offset = 0, asio_offset = 0;
/* Interleaves audio */ /* Interleaves audio */
while (gst_offset < len) { while (gst_offset < (guint) len) {
for (i = 0; i < num_channels; i++) { for (i = 0; i < num_channels; i++) {
ASIOBufferInfo *info = self->infos[i]; ASIOBufferInfo *info = self->infos[i];

View file

@ -24,7 +24,6 @@
#include "gstasiosink.h" #include "gstasiosink.h"
#include "gstasioobject.h" #include "gstasioobject.h"
#include "gstasioringbuffer.h" #include "gstasioringbuffer.h"
#include <atlconv.h>
#include <string.h> #include <string.h>
#include <set> #include <set>
#include <vector> #include <vector>
@ -240,8 +239,6 @@ gst_asio_sink_create_ringbuffer (GstAudioBaseSink * sink)
guint i; guint i;
gchar *ringbuffer_name; gchar *ringbuffer_name;
USES_CONVERSION;
GST_DEBUG_OBJECT (self, "Create ringbuffer"); GST_DEBUG_OBJECT (self, "Create ringbuffer");
if (gst_asio_enum (&device_infos) == 0) { if (gst_asio_enum (&device_infos) == 0) {
@ -250,7 +247,10 @@ gst_asio_sink_create_ringbuffer (GstAudioBaseSink * sink)
} }
if (self->device_clsid) { if (self->device_clsid) {
hr = CLSIDFromString (A2COLE (self->device_clsid), &clsid); auto clsid_utf16 = g_utf8_to_utf16 (self->device_clsid,
-1, nullptr, nullptr, nullptr);
hr = CLSIDFromString ((const wchar_t *) clsid_utf16, &clsid);
g_free (clsid_utf16);
if (FAILED (hr)) { if (FAILED (hr)) {
GST_WARNING_OBJECT (self, "Failed to convert %s to CLSID", GST_WARNING_OBJECT (self, "Failed to convert %s to CLSID",
self->device_clsid); self->device_clsid);
@ -298,7 +298,7 @@ gst_asio_sink_create_ringbuffer (GstAudioBaseSink * sink)
ch = g_strsplit (self->output_channels, ",", 0); ch = g_strsplit (self->output_channels, ",", 0);
auto num_channels = g_strv_length (ch); auto num_channels = g_strv_length (ch);
if (num_channels > max_output_ch) { if (num_channels > (guint) max_output_ch) {
GST_WARNING_OBJECT (self, "To many channels %d were requested", GST_WARNING_OBJECT (self, "To many channels %d were requested",
num_channels); num_channels);
} else { } else {
@ -318,7 +318,7 @@ gst_asio_sink_create_ringbuffer (GstAudioBaseSink * sink)
} }
if (channel_list.size () == 0) { if (channel_list.size () == 0) {
for (i = 0; i < max_output_ch; i++) for (i = 0; i < (guint) max_output_ch; i++)
channel_indices.push_back (i); channel_indices.push_back (i);
} else { } else {
for (auto iter : channel_list) for (auto iter : channel_list)

View file

@ -24,7 +24,6 @@
#include "gstasiosrc.h" #include "gstasiosrc.h"
#include "gstasioobject.h" #include "gstasioobject.h"
#include "gstasioringbuffer.h" #include "gstasioringbuffer.h"
#include <atlconv.h>
#include <string.h> #include <string.h>
#include <set> #include <set>
#include <vector> #include <vector>
@ -253,7 +252,6 @@ gst_asio_src_create_ringbuffer (GstAudioBaseSrc * src)
guint i; guint i;
gchar *ringbuffer_name; gchar *ringbuffer_name;
USES_CONVERSION;
GST_DEBUG_OBJECT (self, "Create ringbuffer"); GST_DEBUG_OBJECT (self, "Create ringbuffer");
@ -263,7 +261,11 @@ gst_asio_src_create_ringbuffer (GstAudioBaseSrc * src)
} }
if (self->device_clsid) { if (self->device_clsid) {
hr = CLSIDFromString (A2COLE (self->device_clsid), &clsid); auto clsid_utf16 = g_utf8_to_utf16 (self->device_clsid,
-1, nullptr, nullptr, nullptr);
hr = CLSIDFromString ((const wchar_t *) clsid_utf16, &clsid);
g_free (clsid_utf16);
if (FAILED (hr)) { if (FAILED (hr)) {
GST_WARNING_OBJECT (self, "Failed to convert %s to CLSID", GST_WARNING_OBJECT (self, "Failed to convert %s to CLSID",
self->device_clsid); self->device_clsid);
@ -311,7 +313,7 @@ gst_asio_src_create_ringbuffer (GstAudioBaseSrc * src)
ch = g_strsplit (self->capture_channles, ",", 0); ch = g_strsplit (self->capture_channles, ",", 0);
auto num_channels = g_strv_length (ch); auto num_channels = g_strv_length (ch);
if (num_channels > max_input_ch) { if (num_channels > (guint) max_input_ch) {
GST_WARNING_OBJECT (self, "To many channels %d were requested", GST_WARNING_OBJECT (self, "To many channels %d were requested",
num_channels); num_channels);
} else { } else {
@ -331,7 +333,7 @@ gst_asio_src_create_ringbuffer (GstAudioBaseSrc * src)
} }
if (channel_list.size () == 0) { if (channel_list.size () == 0) {
for (i = 0; i < max_input_ch; i++) for (i = 0; i < (guint) max_input_ch; i++)
channel_indices.push_back (i); channel_indices.push_back (i);
} else { } else {
for (auto iter : channel_list) for (auto iter : channel_list)

View file

@ -24,7 +24,6 @@
#include "gstasioutils.h" #include "gstasioutils.h"
#include <windows.h> #include <windows.h>
#include <string.h> #include <string.h>
#include <atlconv.h>
static gboolean static gboolean
gst_asio_enum_check_class_root (GstAsioDeviceInfo * info, LPCWSTR clsid) gst_asio_enum_check_class_root (GstAsioDeviceInfo * info, LPCWSTR clsid)
@ -93,8 +92,6 @@ gst_asio_enum_new_device_info_from_reg (HKEY reg_key, LPWSTR key_name)
CLSID id; CLSID id;
HRESULT hr; HRESULT hr;
USES_CONVERSION;
status = RegOpenKeyExW (reg_key, key_name, 0, KEY_READ, &sub_key); status = RegOpenKeyExW (reg_key, key_name, 0, KEY_READ, &sub_key);
if (status != ERROR_SUCCESS) if (status != ERROR_SUCCESS)
return nullptr; return nullptr;
@ -105,7 +102,7 @@ gst_asio_enum_new_device_info_from_reg (HKEY reg_key, LPWSTR key_name)
if (status != ERROR_SUCCESS) if (status != ERROR_SUCCESS)
goto done; goto done;
hr = CLSIDFromString (W2COLE (clsid_data), &id); hr = CLSIDFromString (clsid_data, &id);
if (FAILED (hr)) if (FAILED (hr))
goto done; goto done;

View file

@ -13,16 +13,6 @@ if asio_option.disabled() or host_system != 'windows'
subdir_done() subdir_done()
endif endif
# FIXME: non-msvc is not tested, and unlikely supported yet because of
# tool-chain issue
if cxx.get_id() != 'msvc'
if asio_option.enabled()
error('asio plugin can only be built with MSVC')
else
subdir_done ()
endif
endif
winapi_desktop = cxx.compiles('''#include <winapifamily.h> winapi_desktop = cxx.compiles('''#include <winapifamily.h>
#if !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) #if !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
#error "not win32" #error "not win32"
@ -42,15 +32,10 @@ if not avrt_lib.found()
subdir_done () subdir_done ()
endif endif
winmm_lib = cc.find_library('winmm', required: asio_option)
if not winmm_lib.found()
subdir_done ()
endif
gstasio = library('gstasio', gstasio = library('gstasio',
asio_sources, asio_sources,
include_directories : [configinc], include_directories : [configinc],
dependencies : [gstaudio_dep, avrt_lib, winmm_lib], dependencies : [gstaudio_dep, avrt_lib],
c_args : gst_plugins_bad_args, c_args : gst_plugins_bad_args,
cpp_args : gst_plugins_bad_args, cpp_args : gst_plugins_bad_args,
install : true, install : true,