Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
M
miniaudio
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Locked Files
Issues
0
Issues
0
List
Boards
Labels
Service Desk
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Security & Compliance
Security & Compliance
Dependency List
License Compliance
Packages
Packages
List
Container Registry
Analytics
Analytics
CI / CD
Code Review
Insights
Issues
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
MyCard
miniaudio
Commits
4f453014
Commit
4f453014
authored
Jul 15, 2018
by
David Reid
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Start using the new callback system for the JACK backend.
parent
5b11f5d0
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
132 additions
and
124 deletions
+132
-124
mini_al.h
mini_al.h
+123
-115
tests/mal_test_0.vcxproj
tests/mal_test_0.vcxproj
+9
-9
No files found.
mini_al.h
View file @
4f453014
...
...
@@ -12320,116 +12320,6 @@ mal_result mal_context_get_device_info__jack(mal_context* pContext, mal_device_t
return MAL_SUCCESS;
}
mal_result mal_context_init__jack(mal_context* pContext)
{
mal_assert(pContext != NULL);
#ifndef MAL_NO_RUNTIME_LINKING
// libjack.so
const char* libjackNames[] = {
#ifdef MAL_WIN32
"libjack.dll"
#else
"libjack.so",
"libjack.so.0"
#endif
};
for (size_t i = 0; i < mal_countof(libjackNames); ++i) {
pContext->jack.jackSO = mal_dlopen(libjackNames[i]);
if (pContext->jack.jackSO != NULL) {
break;
}
}
if (pContext->jack.jackSO == NULL) {
return MAL_NO_BACKEND;
}
pContext->jack.jack_client_open = (mal_proc)mal_dlsym(pContext->jack.jackSO, "jack_client_open");
pContext->jack.jack_client_close = (mal_proc)mal_dlsym(pContext->jack.jackSO, "jack_client_close");
pContext->jack.jack_client_name_size = (mal_proc)mal_dlsym(pContext->jack.jackSO, "jack_client_name_size");
pContext->jack.jack_set_process_callback = (mal_proc)mal_dlsym(pContext->jack.jackSO, "jack_set_process_callback");
pContext->jack.jack_set_buffer_size_callback = (mal_proc)mal_dlsym(pContext->jack.jackSO, "jack_set_buffer_size_callback");
pContext->jack.jack_on_shutdown = (mal_proc)mal_dlsym(pContext->jack.jackSO, "jack_on_shutdown");
pContext->jack.jack_get_sample_rate = (mal_proc)mal_dlsym(pContext->jack.jackSO, "jack_get_sample_rate");
pContext->jack.jack_get_buffer_size = (mal_proc)mal_dlsym(pContext->jack.jackSO, "jack_get_buffer_size");
pContext->jack.jack_get_ports = (mal_proc)mal_dlsym(pContext->jack.jackSO, "jack_get_ports");
pContext->jack.jack_activate = (mal_proc)mal_dlsym(pContext->jack.jackSO, "jack_activate");
pContext->jack.jack_deactivate = (mal_proc)mal_dlsym(pContext->jack.jackSO, "jack_deactivate");
pContext->jack.jack_connect = (mal_proc)mal_dlsym(pContext->jack.jackSO, "jack_connect");
pContext->jack.jack_port_register = (mal_proc)mal_dlsym(pContext->jack.jackSO, "jack_port_register");
pContext->jack.jack_port_name = (mal_proc)mal_dlsym(pContext->jack.jackSO, "jack_port_name");
pContext->jack.jack_port_get_buffer = (mal_proc)mal_dlsym(pContext->jack.jackSO, "jack_port_get_buffer");
pContext->jack.jack_free = (mal_proc)mal_dlsym(pContext->jack.jackSO, "jack_free");
#else
// This strange assignment system is here just to ensure type safety of mini_al's function pointer
// types. If anything differs slightly the compiler should throw a warning.
mal_jack_client_open_proc _jack_client_open = jack_client_open;
mal_jack_client_close_proc _jack_client_close = jack_client_close;
mal_jack_client_name_size_proc _jack_client_name_size = jack_client_name_size;
mal_jack_set_process_callback_proc _jack_set_process_callback = jack_set_process_callback;
mal_jack_set_buffer_size_callback_proc _jack_set_buffer_size_callback = jack_set_buffer_size_callback;
mal_jack_on_shutdown_proc _jack_on_shutdown = jack_on_shutdown;
mal_jack_get_sample_rate_proc _jack_get_sample_rate = jack_get_sample_rate;
mal_jack_get_buffer_size_proc _jack_get_buffer_size = jack_get_buffer_size;
mal_jack_get_ports_proc _jack_get_ports = jack_get_ports;
mal_jack_activate_proc _jack_activate = jack_activate;
mal_jack_deactivate_proc _jack_deactivate = jack_deactivate;
mal_jack_connect_proc _jack_connect = jack_connect;
mal_jack_port_register_proc _jack_port_register = jack_port_register;
mal_jack_port_name_proc _jack_port_name = jack_port_name;
mal_jack_port_get_buffer_proc _jack_port_get_buffer = jack_port_get_buffer;
mal_jack_free_proc _jack_free = jack_free;
pContext->jack.jack_client_open = (mal_proc)_jack_client_open;
pContext->jack.jack_client_close = (mal_proc)_jack_client_close;
pContext->jack.jack_client_name_size = (mal_proc)_jack_client_name_size;
pContext->jack.jack_set_process_callback = (mal_proc)_jack_set_process_callback;
pContext->jack.jack_set_buffer_size_callback = (mal_proc)_jack_set_buffer_size_callback;
pContext->jack.jack_on_shutdown = (mal_proc)_jack_on_shutdown;
pContext->jack.jack_get_sample_rate = (mal_proc)_jack_get_sample_rate;
pContext->jack.jack_get_buffer_size = (mal_proc)_jack_get_buffer_size;
pContext->jack.jack_get_ports = (mal_proc)_jack_get_ports;
pContext->jack.jack_activate = (mal_proc)_jack_activate;
pContext->jack.jack_deactivate = (mal_proc)_jack_deactivate;
pContext->jack.jack_connect = (mal_proc)_jack_connect;
pContext->jack.jack_port_register = (mal_proc)_jack_port_register;
pContext->jack.jack_port_name = (mal_proc)_jack_port_name;
pContext->jack.jack_port_get_buffer = (mal_proc)_jack_port_get_buffer;
pContext->jack.jack_free = (mal_proc)_jack_free;
#endif
pContext->isBackendAsynchronous = MAL_TRUE;
pContext->onDeviceIDEqual = mal_context_is_device_id_equal__jack;
pContext->onEnumDevices = mal_context_enumerate_devices__jack;
pContext->onGetDeviceInfo = mal_context_get_device_info__jack;
// Getting here means the JACK library is installed, but it doesn't necessarily mean it's usable. We need to quickly test this by connecting
// a temporary client.
mal_jack_client_t* pDummyClient;
mal_result result = mal_context_open_client__jack(pContext, &pDummyClient);
if (result != MAL_SUCCESS) {
return MAL_NO_BACKEND;
}
((mal_jack_client_close_proc)pContext->jack.jack_client_close)((mal_jack_client_t*)pDummyClient);
return MAL_SUCCESS;
}
mal_result mal_context_uninit__jack(mal_context* pContext)
{
mal_assert(pContext != NULL);
mal_assert(pContext->backend == mal_backend_jack);
#ifndef MAL_NO_RUNTIME_LINKING
mal_dlclose(pContext->jack.jackSO);
#endif
return MAL_SUCCESS;
}
void mal_device_uninit__jack(mal_device* pDevice)
{
...
...
@@ -12677,6 +12567,124 @@ mal_result mal_device__stop_backend__jack(mal_device* pDevice)
return MAL_SUCCESS;
}
mal_result mal_context_uninit__jack(mal_context* pContext)
{
mal_assert(pContext != NULL);
mal_assert(pContext->backend == mal_backend_jack);
#ifndef MAL_NO_RUNTIME_LINKING
mal_dlclose(pContext->jack.jackSO);
#endif
return MAL_SUCCESS;
}
mal_result mal_context_init__jack(mal_context* pContext)
{
mal_assert(pContext != NULL);
#ifndef MAL_NO_RUNTIME_LINKING
// libjack.so
const char* libjackNames[] = {
#ifdef MAL_WIN32
"libjack.dll"
#else
"libjack.so",
"libjack.so.0"
#endif
};
for (size_t i = 0; i < mal_countof(libjackNames); ++i) {
pContext->jack.jackSO = mal_dlopen(libjackNames[i]);
if (pContext->jack.jackSO != NULL) {
break;
}
}
if (pContext->jack.jackSO == NULL) {
return MAL_NO_BACKEND;
}
pContext->jack.jack_client_open = (mal_proc)mal_dlsym(pContext->jack.jackSO, "jack_client_open");
pContext->jack.jack_client_close = (mal_proc)mal_dlsym(pContext->jack.jackSO, "jack_client_close");
pContext->jack.jack_client_name_size = (mal_proc)mal_dlsym(pContext->jack.jackSO, "jack_client_name_size");
pContext->jack.jack_set_process_callback = (mal_proc)mal_dlsym(pContext->jack.jackSO, "jack_set_process_callback");
pContext->jack.jack_set_buffer_size_callback = (mal_proc)mal_dlsym(pContext->jack.jackSO, "jack_set_buffer_size_callback");
pContext->jack.jack_on_shutdown = (mal_proc)mal_dlsym(pContext->jack.jackSO, "jack_on_shutdown");
pContext->jack.jack_get_sample_rate = (mal_proc)mal_dlsym(pContext->jack.jackSO, "jack_get_sample_rate");
pContext->jack.jack_get_buffer_size = (mal_proc)mal_dlsym(pContext->jack.jackSO, "jack_get_buffer_size");
pContext->jack.jack_get_ports = (mal_proc)mal_dlsym(pContext->jack.jackSO, "jack_get_ports");
pContext->jack.jack_activate = (mal_proc)mal_dlsym(pContext->jack.jackSO, "jack_activate");
pContext->jack.jack_deactivate = (mal_proc)mal_dlsym(pContext->jack.jackSO, "jack_deactivate");
pContext->jack.jack_connect = (mal_proc)mal_dlsym(pContext->jack.jackSO, "jack_connect");
pContext->jack.jack_port_register = (mal_proc)mal_dlsym(pContext->jack.jackSO, "jack_port_register");
pContext->jack.jack_port_name = (mal_proc)mal_dlsym(pContext->jack.jackSO, "jack_port_name");
pContext->jack.jack_port_get_buffer = (mal_proc)mal_dlsym(pContext->jack.jackSO, "jack_port_get_buffer");
pContext->jack.jack_free = (mal_proc)mal_dlsym(pContext->jack.jackSO, "jack_free");
#else
// This strange assignment system is here just to ensure type safety of mini_al's function pointer
// types. If anything differs slightly the compiler should throw a warning.
mal_jack_client_open_proc _jack_client_open = jack_client_open;
mal_jack_client_close_proc _jack_client_close = jack_client_close;
mal_jack_client_name_size_proc _jack_client_name_size = jack_client_name_size;
mal_jack_set_process_callback_proc _jack_set_process_callback = jack_set_process_callback;
mal_jack_set_buffer_size_callback_proc _jack_set_buffer_size_callback = jack_set_buffer_size_callback;
mal_jack_on_shutdown_proc _jack_on_shutdown = jack_on_shutdown;
mal_jack_get_sample_rate_proc _jack_get_sample_rate = jack_get_sample_rate;
mal_jack_get_buffer_size_proc _jack_get_buffer_size = jack_get_buffer_size;
mal_jack_get_ports_proc _jack_get_ports = jack_get_ports;
mal_jack_activate_proc _jack_activate = jack_activate;
mal_jack_deactivate_proc _jack_deactivate = jack_deactivate;
mal_jack_connect_proc _jack_connect = jack_connect;
mal_jack_port_register_proc _jack_port_register = jack_port_register;
mal_jack_port_name_proc _jack_port_name = jack_port_name;
mal_jack_port_get_buffer_proc _jack_port_get_buffer = jack_port_get_buffer;
mal_jack_free_proc _jack_free = jack_free;
pContext->jack.jack_client_open = (mal_proc)_jack_client_open;
pContext->jack.jack_client_close = (mal_proc)_jack_client_close;
pContext->jack.jack_client_name_size = (mal_proc)_jack_client_name_size;
pContext->jack.jack_set_process_callback = (mal_proc)_jack_set_process_callback;
pContext->jack.jack_set_buffer_size_callback = (mal_proc)_jack_set_buffer_size_callback;
pContext->jack.jack_on_shutdown = (mal_proc)_jack_on_shutdown;
pContext->jack.jack_get_sample_rate = (mal_proc)_jack_get_sample_rate;
pContext->jack.jack_get_buffer_size = (mal_proc)_jack_get_buffer_size;
pContext->jack.jack_get_ports = (mal_proc)_jack_get_ports;
pContext->jack.jack_activate = (mal_proc)_jack_activate;
pContext->jack.jack_deactivate = (mal_proc)_jack_deactivate;
pContext->jack.jack_connect = (mal_proc)_jack_connect;
pContext->jack.jack_port_register = (mal_proc)_jack_port_register;
pContext->jack.jack_port_name = (mal_proc)_jack_port_name;
pContext->jack.jack_port_get_buffer = (mal_proc)_jack_port_get_buffer;
pContext->jack.jack_free = (mal_proc)_jack_free;
#endif
pContext->isBackendAsynchronous = MAL_TRUE;
pContext->onUninit = mal_context_uninit__jack;
pContext->onDeviceIDEqual = mal_context_is_device_id_equal__jack;
pContext->onEnumDevices = mal_context_enumerate_devices__jack;
pContext->onGetDeviceInfo = mal_context_get_device_info__jack;
pContext->onGetDeviceInfo = mal_context_get_device_info__jack;
pContext->onDeviceInit = mal_device_init__jack;
pContext->onDeviceUninit = mal_device_uninit__jack;
pContext->onDeviceStart = mal_device__start_backend__jack;
pContext->onDeviceStop = mal_device__stop_backend__jack;
// Getting here means the JACK library is installed, but it doesn't necessarily mean it's usable. We need to quickly test this by connecting
// a temporary client.
mal_jack_client_t* pDummyClient;
mal_result result = mal_context_open_client__jack(pContext, &pDummyClient);
if (result != MAL_SUCCESS) {
return MAL_NO_BACKEND;
}
((mal_jack_client_close_proc)pContext->jack.jack_client_close)((mal_jack_client_t*)pDummyClient);
return MAL_SUCCESS;
}
#endif // JACK
...
...
@@ -17982,7 +17990,7 @@ mal_result mal_context_uninit(mal_context* pContext)
#ifdef MAL_HAS_JACK
case mal_backend_jack:
{
mal_context_uninit__jack
(pContext);
pContext->onUninit
(pContext);
} break;
#endif
#ifdef MAL_HAS_COREAUDIO
...
...
@@ -18328,7 +18336,7 @@ mal_result mal_device_init(mal_context* pContext, mal_device_type type, mal_devi
#ifdef MAL_HAS_JACK
case mal_backend_jack:
{
result =
mal_device_init__jack
(pContext, type, pDeviceID, &config, pDevice);
result =
pContext->onDeviceInit
(pContext, type, pDeviceID, &config, pDevice);
} break;
#endif
#ifdef MAL_HAS_COREAUDIO
...
...
@@ -18545,7 +18553,7 @@ void mal_device_uninit(mal_device* pDevice)
#endif
#ifdef MAL_HAS_JACK
if (pDevice->pContext->backend == mal_backend_jack) {
mal_device_uninit__jack
(pDevice);
pDevice->pContext->onDeviceUninit
(pDevice);
}
#endif
#ifdef MAL_HAS_COREAUDIO
...
...
@@ -18641,7 +18649,7 @@ mal_result mal_device_start(mal_device* pDevice)
if (mal_context_is_backend_asynchronous(pDevice->pContext)) {
#ifdef MAL_HAS_JACK
if (pDevice->pContext->backend == mal_backend_jack) {
result =
mal_device__start_backend__jack
(pDevice);
result =
pDevice->pContext->onDeviceStart
(pDevice);
if (result == MAL_SUCCESS) {
mal_device__set_state(pDevice, MAL_STATE_STARTED);
}
...
...
@@ -18720,7 +18728,7 @@ mal_result mal_device_stop(mal_device* pDevice)
if (mal_context_is_backend_asynchronous(pDevice->pContext)) {
#ifdef MAL_HAS_JACK
if (pDevice->pContext->backend == mal_backend_jack) {
mal_device__stop_backend__jack
(pDevice);
pDevice->pContext->onDeviceStop
(pDevice);
}
#endif
#ifdef MAL_HAS_COREAUDIO
tests/mal_test_0.vcxproj
View file @
4f453014
...
...
@@ -279,21 +279,21 @@
<ExcludedFromBuild
Condition=
"'$(Configuration)|$(Platform)'=='Release|x64'"
>
true
</ExcludedFromBuild>
</ClCompile>
<ClCompile
Include=
"mal_resampling.c"
>
<ExcludedFromBuild
Condition=
"'$(Configuration)|$(Platform)'=='Debug|Win32'"
>
false
</ExcludedFromBuild>
<ExcludedFromBuild
Condition=
"'$(Configuration)|$(Platform)'=='Release|Win32'"
>
false
</ExcludedFromBuild>
<ExcludedFromBuild
Condition=
"'$(Configuration)|$(Platform)'=='Debug|ARM'"
>
false
</ExcludedFromBuild>
<ExcludedFromBuild
Condition=
"'$(Configuration)|$(Platform)'=='Release|ARM'"
>
false
</ExcludedFromBuild>
<ExcludedFromBuild
Condition=
"'$(Configuration)|$(Platform)'=='Debug|x64'"
>
false
</ExcludedFromBuild>
<ExcludedFromBuild
Condition=
"'$(Configuration)|$(Platform)'=='Release|x64'"
>
false
</ExcludedFromBuild>
</ClCompile>
<ClCompile
Include=
"mal_test_0.c"
>
<ExcludedFromBuild
Condition=
"'$(Configuration)|$(Platform)'=='Debug|Win32'"
>
true
</ExcludedFromBuild>
<ExcludedFromBuild
Condition=
"'$(Configuration)|$(Platform)'=='Debug|ARM'"
>
true
</ExcludedFromBuild>
<ExcludedFromBuild
Condition=
"'$(Configuration)|$(Platform)'=='Release|Win32'"
>
true
</ExcludedFromBuild>
<ExcludedFromBuild
Condition=
"'$(Configuration)|$(Platform)'=='Debug|ARM'"
>
true
</ExcludedFromBuild>
<ExcludedFromBuild
Condition=
"'$(Configuration)|$(Platform)'=='Release|ARM'"
>
true
</ExcludedFromBuild>
<ExcludedFromBuild
Condition=
"'$(Configuration)|$(Platform)'=='Debug|x64'"
>
true
</ExcludedFromBuild>
<ExcludedFromBuild
Condition=
"'$(Configuration)|$(Platform)'=='Release|x64'"
>
true
</ExcludedFromBuild>
</ClCompile>
<ClCompile
Include=
"mal_test_0.c"
>
<ExcludedFromBuild
Condition=
"'$(Configuration)|$(Platform)'=='Debug|Win32'"
>
false
</ExcludedFromBuild>
<ExcludedFromBuild
Condition=
"'$(Configuration)|$(Platform)'=='Debug|ARM'"
>
false
</ExcludedFromBuild>
<ExcludedFromBuild
Condition=
"'$(Configuration)|$(Platform)'=='Release|Win32'"
>
false
</ExcludedFromBuild>
<ExcludedFromBuild
Condition=
"'$(Configuration)|$(Platform)'=='Release|ARM'"
>
false
</ExcludedFromBuild>
<ExcludedFromBuild
Condition=
"'$(Configuration)|$(Platform)'=='Debug|x64'"
>
false
</ExcludedFromBuild>
<ExcludedFromBuild
Condition=
"'$(Configuration)|$(Platform)'=='Release|x64'"
>
false
</ExcludedFromBuild>
</ClCompile>
<ClCompile
Include=
"mal_test_0.cpp"
>
<ExcludedFromBuild
Condition=
"'$(Configuration)|$(Platform)'=='Debug|Win32'"
>
true
</ExcludedFromBuild>
<ExcludedFromBuild
Condition=
"'$(Configuration)|$(Platform)'=='Debug|ARM'"
>
true
</ExcludedFromBuild>
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment