// Auto-generated with: android/scripts/gen-entries.py --mode=wrapper audio/wrappers/alsa.entries
// DO NOT EDIT THIS FILE

#include <dlfcn.h>
#include <alsa/asoundlib.h>

///
///  W R A P P E R   P O I N T E R S
///

static snd_pcm_sframes_t (*__dll_snd_pcm_avail_update)(snd_pcm_t * pcm) = 0;
static int (*__dll_snd_pcm_close)(snd_pcm_t * pcm) = 0;
static int (*__dll_snd_pcm_drop)(snd_pcm_t * pcm) = 0;
static int (*__dll_snd_pcm_hw_params)(snd_pcm_t * pcm, snd_pcm_hw_params_t * params) = 0;
static int (*__dll_snd_pcm_hw_params_any)(snd_pcm_t * pcm, snd_pcm_hw_params_t * params) = 0;
static int (*__dll_snd_pcm_hw_params_get_buffer_size)(const snd_pcm_hw_params_t * params, snd_pcm_uframes_t * val) = 0;
static int (*__dll_snd_pcm_hw_params_get_format)(const snd_pcm_hw_params_t * params, snd_pcm_format_t * val) = 0;
static int (*__dll_snd_pcm_hw_params_set_access)(snd_pcm_t * pcm, snd_pcm_hw_params_t * params, snd_pcm_access_t _access) = 0;
static int (*__dll_snd_pcm_hw_params_set_buffer_size_near)(snd_pcm_t * pcm, snd_pcm_hw_params_t * params, snd_pcm_uframes_t * val) = 0;
static int (*__dll_snd_pcm_hw_params_set_buffer_time_near)(snd_pcm_t * pcm, snd_pcm_hw_params_t * params, unsigned int * val, int * dir) = 0;
static int (*__dll_snd_pcm_hw_params_set_channels_near)(snd_pcm_t * pcm, snd_pcm_hw_params_t * params, unsigned int * val) = 0;
static int (*__dll_snd_pcm_hw_params_set_format)(snd_pcm_t * pcm, snd_pcm_hw_params_t * params, snd_pcm_format_t val) = 0;
static int (*__dll_snd_pcm_hw_params_set_period_size_near)(snd_pcm_t * pcm, snd_pcm_hw_params_t * params, snd_pcm_uframes_t * val, int * dir) = 0;
static int (*__dll_snd_pcm_hw_params_set_period_time_near)(snd_pcm_t * pcm, snd_pcm_hw_params_t * params, unsigned int * val, int * dir) = 0;
static int (*__dll_snd_pcm_hw_params_set_rate_near)(snd_pcm_t * pcm, snd_pcm_hw_params_t * params, unsigned int * val, int * dir) = 0;
static size_t (*__dll_snd_pcm_hw_params_sizeof)() = 0;
static int (*__dll_snd_pcm_open)(snd_pcm_t ** pcm, const char * name, snd_pcm_stream_t stream, int mode) = 0;
static int (*__dll_snd_pcm_poll_descriptors)(snd_pcm_t * pcm, struct pollfd * pfds, unsigned int space) = 0;
static int (*__dll_snd_pcm_poll_descriptors_count)(snd_pcm_t * pcm) = 0;
static int (*__dll_snd_pcm_poll_descriptors_revents)(snd_pcm_t * pcm, struct pollfd * pfds, unsigned int nfds, unsigned short * revents) = 0;
static int (*__dll_snd_pcm_prepare)(snd_pcm_t * pcm) = 0;
static snd_pcm_sframes_t (*__dll_snd_pcm_readi)(snd_pcm_t * pcm, void * buffer, snd_pcm_uframes_t size) = 0;
static int (*__dll_snd_pcm_resume)(snd_pcm_t * pcm) = 0;
static snd_pcm_state_t (*__dll_snd_pcm_state)(snd_pcm_t * pcm) = 0;
static int (*__dll_snd_pcm_sw_params)(snd_pcm_t * pcm, snd_pcm_sw_params_t * params) = 0;
static int (*__dll_snd_pcm_sw_params_current)(snd_pcm_t * pcm, snd_pcm_sw_params_t * params) = 0;
static int (*__dll_snd_pcm_sw_params_set_start_threshold)(snd_pcm_t * pcm, snd_pcm_sw_params_t * params, snd_pcm_uframes_t val) = 0;
static size_t (*__dll_snd_pcm_sw_params_sizeof)() = 0;
static snd_pcm_sframes_t (*__dll_snd_pcm_writei)(snd_pcm_t * pcm, const void * buffer, snd_pcm_uframes_t size) = 0;
static const char * (*__dll_snd_strerror)(int errnum) = 0;

///
///  W R A P P E R   F U N C T I O N S
///

snd_pcm_sframes_t snd_pcm_avail_update(snd_pcm_t * pcm) {
  return __dll_snd_pcm_avail_update(pcm);
}

int snd_pcm_close(snd_pcm_t * pcm) {
  return __dll_snd_pcm_close(pcm);
}

int snd_pcm_drop(snd_pcm_t * pcm) {
  return __dll_snd_pcm_drop(pcm);
}

int snd_pcm_hw_params(snd_pcm_t * pcm, snd_pcm_hw_params_t * params) {
  return __dll_snd_pcm_hw_params(pcm, params);
}

int snd_pcm_hw_params_any(snd_pcm_t * pcm, snd_pcm_hw_params_t * params) {
  return __dll_snd_pcm_hw_params_any(pcm, params);
}

int snd_pcm_hw_params_get_buffer_size(const snd_pcm_hw_params_t * params, snd_pcm_uframes_t * val) {
  return __dll_snd_pcm_hw_params_get_buffer_size(params, val);
}

int snd_pcm_hw_params_get_format(const snd_pcm_hw_params_t * params, snd_pcm_format_t * val) {
  return __dll_snd_pcm_hw_params_get_format(params, val);
}

int snd_pcm_hw_params_set_access(snd_pcm_t * pcm, snd_pcm_hw_params_t * params, snd_pcm_access_t _access) {
  return __dll_snd_pcm_hw_params_set_access(pcm, params, _access);
}

int snd_pcm_hw_params_set_buffer_size_near(snd_pcm_t * pcm, snd_pcm_hw_params_t * params, snd_pcm_uframes_t * val) {
  return __dll_snd_pcm_hw_params_set_buffer_size_near(pcm, params, val);
}

int snd_pcm_hw_params_set_buffer_time_near(snd_pcm_t * pcm, snd_pcm_hw_params_t * params, unsigned int * val, int * dir) {
  return __dll_snd_pcm_hw_params_set_buffer_time_near(pcm, params, val, dir);
}

int snd_pcm_hw_params_set_channels_near(snd_pcm_t * pcm, snd_pcm_hw_params_t * params, unsigned int * val) {
  return __dll_snd_pcm_hw_params_set_channels_near(pcm, params, val);
}

int snd_pcm_hw_params_set_format(snd_pcm_t * pcm, snd_pcm_hw_params_t * params, snd_pcm_format_t val) {
  return __dll_snd_pcm_hw_params_set_format(pcm, params, val);
}

int snd_pcm_hw_params_set_period_size_near(snd_pcm_t * pcm, snd_pcm_hw_params_t * params, snd_pcm_uframes_t * val, int * dir) {
  return __dll_snd_pcm_hw_params_set_period_size_near(pcm, params, val, dir);
}

int snd_pcm_hw_params_set_period_time_near(snd_pcm_t * pcm, snd_pcm_hw_params_t * params, unsigned int * val, int * dir) {
  return __dll_snd_pcm_hw_params_set_period_time_near(pcm, params, val, dir);
}

int snd_pcm_hw_params_set_rate_near(snd_pcm_t * pcm, snd_pcm_hw_params_t * params, unsigned int * val, int * dir) {
  return __dll_snd_pcm_hw_params_set_rate_near(pcm, params, val, dir);
}

size_t snd_pcm_hw_params_sizeof() {
  return __dll_snd_pcm_hw_params_sizeof();
}

int snd_pcm_open(snd_pcm_t ** pcm, const char * name, snd_pcm_stream_t stream, int mode) {
  return __dll_snd_pcm_open(pcm, name, stream, mode);
}

int snd_pcm_poll_descriptors(snd_pcm_t * pcm, struct pollfd * pfds, unsigned int space) {
  return __dll_snd_pcm_poll_descriptors(pcm, pfds, space);
}

int snd_pcm_poll_descriptors_count(snd_pcm_t * pcm) {
  return __dll_snd_pcm_poll_descriptors_count(pcm);
}

int snd_pcm_poll_descriptors_revents(snd_pcm_t * pcm, struct pollfd * pfds, unsigned int nfds, unsigned short * revents) {
  return __dll_snd_pcm_poll_descriptors_revents(pcm, pfds, nfds, revents);
}

int snd_pcm_prepare(snd_pcm_t * pcm) {
  return __dll_snd_pcm_prepare(pcm);
}

snd_pcm_sframes_t snd_pcm_readi(snd_pcm_t * pcm, void * buffer, snd_pcm_uframes_t size) {
  return __dll_snd_pcm_readi(pcm, buffer, size);
}

int snd_pcm_resume(snd_pcm_t * pcm) {
  return __dll_snd_pcm_resume(pcm);
}

snd_pcm_state_t snd_pcm_state(snd_pcm_t * pcm) {
  return __dll_snd_pcm_state(pcm);
}

int snd_pcm_sw_params(snd_pcm_t * pcm, snd_pcm_sw_params_t * params) {
  return __dll_snd_pcm_sw_params(pcm, params);
}

int snd_pcm_sw_params_current(snd_pcm_t * pcm, snd_pcm_sw_params_t * params) {
  return __dll_snd_pcm_sw_params_current(pcm, params);
}

int snd_pcm_sw_params_set_start_threshold(snd_pcm_t * pcm, snd_pcm_sw_params_t * params, snd_pcm_uframes_t val) {
  return __dll_snd_pcm_sw_params_set_start_threshold(pcm, params, val);
}

size_t snd_pcm_sw_params_sizeof() {
  return __dll_snd_pcm_sw_params_sizeof();
}

snd_pcm_sframes_t snd_pcm_writei(snd_pcm_t * pcm, const void * buffer, snd_pcm_uframes_t size) {
  return __dll_snd_pcm_writei(pcm, buffer, size);
}

const char * snd_strerror(int errnum) {
  return __dll_snd_strerror(errnum);
}


///
///  I N I T I A L I Z A T I O N   F U N C T I O N
///

int alsa_dynlink_init(void* lib) {
  __dll_snd_pcm_avail_update = (snd_pcm_sframes_t(*)(snd_pcm_t * pcm))dlsym(lib, "snd_pcm_avail_update");
  if (!__dll_snd_pcm_avail_update) return -1;
  __dll_snd_pcm_close = (int(*)(snd_pcm_t * pcm))dlsym(lib, "snd_pcm_close");
  if (!__dll_snd_pcm_close) return -1;
  __dll_snd_pcm_drop = (int(*)(snd_pcm_t * pcm))dlsym(lib, "snd_pcm_drop");
  if (!__dll_snd_pcm_drop) return -1;
  __dll_snd_pcm_hw_params = (int(*)(snd_pcm_t * pcm, snd_pcm_hw_params_t * params))dlsym(lib, "snd_pcm_hw_params");
  if (!__dll_snd_pcm_hw_params) return -1;
  __dll_snd_pcm_hw_params_any = (int(*)(snd_pcm_t * pcm, snd_pcm_hw_params_t * params))dlsym(lib, "snd_pcm_hw_params_any");
  if (!__dll_snd_pcm_hw_params_any) return -1;
  __dll_snd_pcm_hw_params_get_buffer_size = (int(*)(const snd_pcm_hw_params_t * params, snd_pcm_uframes_t * val))dlsym(lib, "snd_pcm_hw_params_get_buffer_size");
  if (!__dll_snd_pcm_hw_params_get_buffer_size) return -1;
  __dll_snd_pcm_hw_params_get_format = (int(*)(const snd_pcm_hw_params_t * params, snd_pcm_format_t * val))dlsym(lib, "snd_pcm_hw_params_get_format");
  if (!__dll_snd_pcm_hw_params_get_format) return -1;
  __dll_snd_pcm_hw_params_set_access = (int(*)(snd_pcm_t * pcm, snd_pcm_hw_params_t * params, snd_pcm_access_t _access))dlsym(lib, "snd_pcm_hw_params_set_access");
  if (!__dll_snd_pcm_hw_params_set_access) return -1;
  __dll_snd_pcm_hw_params_set_buffer_size_near = (int(*)(snd_pcm_t * pcm, snd_pcm_hw_params_t * params, snd_pcm_uframes_t * val))dlsym(lib, "snd_pcm_hw_params_set_buffer_size_near");
  if (!__dll_snd_pcm_hw_params_set_buffer_size_near) return -1;
  __dll_snd_pcm_hw_params_set_buffer_time_near = (int(*)(snd_pcm_t * pcm, snd_pcm_hw_params_t * params, unsigned int * val, int * dir))dlsym(lib, "snd_pcm_hw_params_set_buffer_time_near");
  if (!__dll_snd_pcm_hw_params_set_buffer_time_near) return -1;
  __dll_snd_pcm_hw_params_set_channels_near = (int(*)(snd_pcm_t * pcm, snd_pcm_hw_params_t * params, unsigned int * val))dlsym(lib, "snd_pcm_hw_params_set_channels_near");
  if (!__dll_snd_pcm_hw_params_set_channels_near) return -1;
  __dll_snd_pcm_hw_params_set_format = (int(*)(snd_pcm_t * pcm, snd_pcm_hw_params_t * params, snd_pcm_format_t val))dlsym(lib, "snd_pcm_hw_params_set_format");
  if (!__dll_snd_pcm_hw_params_set_format) return -1;
  __dll_snd_pcm_hw_params_set_period_size_near = (int(*)(snd_pcm_t * pcm, snd_pcm_hw_params_t * params, snd_pcm_uframes_t * val, int * dir))dlsym(lib, "snd_pcm_hw_params_set_period_size_near");
  if (!__dll_snd_pcm_hw_params_set_period_size_near) return -1;
  __dll_snd_pcm_hw_params_set_period_time_near = (int(*)(snd_pcm_t * pcm, snd_pcm_hw_params_t * params, unsigned int * val, int * dir))dlsym(lib, "snd_pcm_hw_params_set_period_time_near");
  if (!__dll_snd_pcm_hw_params_set_period_time_near) return -1;
  __dll_snd_pcm_hw_params_set_rate_near = (int(*)(snd_pcm_t * pcm, snd_pcm_hw_params_t * params, unsigned int * val, int * dir))dlsym(lib, "snd_pcm_hw_params_set_rate_near");
  if (!__dll_snd_pcm_hw_params_set_rate_near) return -1;
  __dll_snd_pcm_hw_params_sizeof = (size_t(*)())dlsym(lib, "snd_pcm_hw_params_sizeof");
  if (!__dll_snd_pcm_hw_params_sizeof) return -1;
  __dll_snd_pcm_open = (int(*)(snd_pcm_t ** pcm, const char * name, snd_pcm_stream_t stream, int mode))dlsym(lib, "snd_pcm_open");
  if (!__dll_snd_pcm_open) return -1;
  __dll_snd_pcm_poll_descriptors = (int(*)(snd_pcm_t * pcm, struct pollfd * pfds, unsigned int space))dlsym(lib, "snd_pcm_poll_descriptors");
  if (!__dll_snd_pcm_poll_descriptors) return -1;
  __dll_snd_pcm_poll_descriptors_count = (int(*)(snd_pcm_t * pcm))dlsym(lib, "snd_pcm_poll_descriptors_count");
  if (!__dll_snd_pcm_poll_descriptors_count) return -1;
  __dll_snd_pcm_poll_descriptors_revents = (int(*)(snd_pcm_t * pcm, struct pollfd * pfds, unsigned int nfds, unsigned short * revents))dlsym(lib, "snd_pcm_poll_descriptors_revents");
  if (!__dll_snd_pcm_poll_descriptors_revents) return -1;
  __dll_snd_pcm_prepare = (int(*)(snd_pcm_t * pcm))dlsym(lib, "snd_pcm_prepare");
  if (!__dll_snd_pcm_prepare) return -1;
  __dll_snd_pcm_readi = (snd_pcm_sframes_t(*)(snd_pcm_t * pcm, void * buffer, snd_pcm_uframes_t size))dlsym(lib, "snd_pcm_readi");
  if (!__dll_snd_pcm_readi) return -1;
  __dll_snd_pcm_resume = (int(*)(snd_pcm_t * pcm))dlsym(lib, "snd_pcm_resume");
  if (!__dll_snd_pcm_resume) return -1;
  __dll_snd_pcm_state = (snd_pcm_state_t(*)(snd_pcm_t * pcm))dlsym(lib, "snd_pcm_state");
  if (!__dll_snd_pcm_state) return -1;
  __dll_snd_pcm_sw_params = (int(*)(snd_pcm_t * pcm, snd_pcm_sw_params_t * params))dlsym(lib, "snd_pcm_sw_params");
  if (!__dll_snd_pcm_sw_params) return -1;
  __dll_snd_pcm_sw_params_current = (int(*)(snd_pcm_t * pcm, snd_pcm_sw_params_t * params))dlsym(lib, "snd_pcm_sw_params_current");
  if (!__dll_snd_pcm_sw_params_current) return -1;
  __dll_snd_pcm_sw_params_set_start_threshold = (int(*)(snd_pcm_t * pcm, snd_pcm_sw_params_t * params, snd_pcm_uframes_t val))dlsym(lib, "snd_pcm_sw_params_set_start_threshold");
  if (!__dll_snd_pcm_sw_params_set_start_threshold) return -1;
  __dll_snd_pcm_sw_params_sizeof = (size_t(*)())dlsym(lib, "snd_pcm_sw_params_sizeof");
  if (!__dll_snd_pcm_sw_params_sizeof) return -1;
  __dll_snd_pcm_writei = (snd_pcm_sframes_t(*)(snd_pcm_t * pcm, const void * buffer, snd_pcm_uframes_t size))dlsym(lib, "snd_pcm_writei");
  if (!__dll_snd_pcm_writei) return -1;
  __dll_snd_strerror = (const char *(*)(int errnum))dlsym(lib, "snd_strerror");
  if (!__dll_snd_strerror) return -1;
  return 0;
}
