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

#include <dlfcn.h>
#include <esd.h>

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

static int (*__dll_esd_open_sound)(const char * host) = 0;
static int (*__dll_esd_play_stream)(esd_format_t format, int rate, const char * host, const char * name) = 0;
static int (*__dll_esd_record_stream)(esd_format_t format, int rate, const char * host, const char * name) = 0;

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

int esd_open_sound(const char * host) {
  return __dll_esd_open_sound(host);
}

int esd_play_stream(esd_format_t format, int rate, const char * host, const char * name) {
  return __dll_esd_play_stream(format, rate, host, name);
}

int esd_record_stream(esd_format_t format, int rate, const char * host, const char * name) {
  return __dll_esd_record_stream(format, rate, host, name);
}


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

int esound_dynlink_init(void* lib) {
  __dll_esd_open_sound = (int(*)(const char * host))dlsym(lib, "esd_open_sound");
  if (!__dll_esd_open_sound) return -1;
  __dll_esd_play_stream = (int(*)(esd_format_t format, int rate, const char * host, const char * name))dlsym(lib, "esd_play_stream");
  if (!__dll_esd_play_stream) return -1;
  __dll_esd_record_stream = (int(*)(esd_format_t format, int rate, const char * host, const char * name))dlsym(lib, "esd_record_stream");
  if (!__dll_esd_record_stream) return -1;
  return 0;
}
