alsa.audio: drop remaining buffer when closing
[AROS.git] / workbench / devs / AHI / Drivers / Alsa / alsa-bridge / alsa_hostlib.c
blob7f7ade314613d23d080a0ea5db1c8e96bcba6f45
1 /*
2 Copyright © 2015, The AROS Development Team. All rights reserved.
3 $Id$
4 */
6 #include <proto/exec.h>
7 #include <proto/hostlib.h>
8 #include "alsa_hostlib.h"
10 #include <aros/debug.h>
12 static const char *alsa_func_names[] =
14 "snd_pcm_open",
15 "snd_pcm_close",
16 "snd_pcm_hw_params_malloc",
17 "snd_pcm_hw_params_free",
18 "snd_pcm_hw_params_any",
19 "snd_pcm_hw_params_set_access",
20 "snd_pcm_hw_params_set_format",
21 "snd_pcm_hw_params_set_rate_near",
22 "snd_pcm_hw_params_set_channels",
23 "snd_pcm_hw_params",
24 "snd_pcm_prepare",
25 "snd_pcm_writei",
26 "snd_pcm_avail_update",
27 "snd_pcm_hw_params_get_buffer_size",
28 "snd_pcm_hw_params_set_buffer_size",
29 "snd_pcm_drop",
32 #define ALSA_NUM_FUNCS (sizeof(alsa_func_names) / sizeof(alsa_func_names[0]))
34 APTR HostLibBase;
35 struct alsa_func alsa_func;
36 static void * libasoundhandle;
38 static void *hostlib_load_so(const char *sofile, const char **names, int nfuncs,
39 void **funcptr)
41 void *handle;
42 char *err;
43 int i;
45 if ((handle = HostLib_Open(sofile, &err)) == NULL) {
46 D(bug("[ALSA] failed to open '%s': %s\n", sofile, err));
47 return NULL;
50 for (i = 0; i < nfuncs; i++) {
51 funcptr[i] = HostLib_GetPointer(handle, names[i], &err);
52 if (err != NULL) {
53 bug("[ALSA] failed to get symbol '%s' (%s)\n", names[i], err);
54 HostLib_Close(handle, NULL);
55 return NULL;
59 return handle;
62 BOOL ALSA_HostLib_Init()
64 HostLibBase = OpenResource("hostlib.resource");
66 if (!HostLibBase)
67 return FALSE;
69 libasoundhandle = hostlib_load_so("libasound.so", alsa_func_names,
70 ALSA_NUM_FUNCS, (void **)&alsa_func);
72 if (!libasoundhandle)
73 return FALSE;
75 return TRUE;
78 VOID ALSA_HostLib_Cleanup()
80 HostLib_Close(libasoundhandle, NULL);