#pragma once /* * Copyright (C) 2005-2014 Team KODI * http://kodi.tv * * This Program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This Program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with KODI; see the file COPYING. If not, see * . * */ #include #include #include #include #include #include "kodi_adsp_types.h" #include "libXBMC_addon.h" typedef void* ADSPHANDLE; #ifdef _WIN32 #define ADSP_HELPER_DLL "\\library.kodi.adsp\\libKODI_adsp" ADDON_HELPER_EXT #else #define ADSP_HELPER_DLL_NAME "libKODI_adsp-" ADDON_HELPER_ARCH ADDON_HELPER_EXT #define ADSP_HELPER_DLL "/library.kodi.adsp/" ADSP_HELPER_DLL_NAME #endif class CAddonSoundPlay; class CHelper_libKODI_adsp { public: CHelper_libKODI_adsp(void) { m_libKODI_adsp = NULL; m_Handle = NULL; } ~CHelper_libKODI_adsp(void) { if (m_libKODI_adsp) { ADSP_unregister_me(m_Handle, m_Callbacks); dlclose(m_libKODI_adsp); } } /*! * @brief Resolve all callback methods * @param handle Pointer to the add-on * @return True when all methods were resolved, false otherwise. */ bool RegisterMe(void* handle) { m_Handle = handle; std::string libBasePath; libBasePath = ((cb_array*)m_Handle)->libPath; libBasePath += ADSP_HELPER_DLL; #if defined(ANDROID) struct stat st; if(stat(libBasePath.c_str(),&st) != 0) { std::string tempbin = getenv("XBMC_ANDROID_LIBS"); libBasePath = tempbin + "/" + ADSP_HELPER_DLL_NAME; } #endif m_libKODI_adsp = dlopen(libBasePath.c_str(), RTLD_LAZY); if (m_libKODI_adsp == NULL) { fprintf(stderr, "Unable to load %s\n", dlerror()); return false; } ADSP_register_me = (void* (*)(void *HANDLE)) dlsym(m_libKODI_adsp, "ADSP_register_me"); if (ADSP_register_me == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; } ADSP_unregister_me = (void (*)(void* HANDLE, void* CB)) dlsym(m_libKODI_adsp, "ADSP_unregister_me"); if (ADSP_unregister_me == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; } ADSP_add_menu_hook = (void (*)(void* HANDLE, void* CB, AE_DSP_MENUHOOK *hook)) dlsym(m_libKODI_adsp, "ADSP_add_menu_hook"); if (ADSP_add_menu_hook == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; } ADSP_remove_menu_hook = (void (*)(void* HANDLE, void* CB, AE_DSP_MENUHOOK *hook)) dlsym(m_libKODI_adsp, "ADSP_remove_menu_hook"); if (ADSP_remove_menu_hook == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; } ADSP_register_mode = (void (*)(void *HANDLE, void* CB, AE_DSP_MODES::AE_DSP_MODE *modes)) dlsym(m_libKODI_adsp, "ADSP_register_mode"); if (ADSP_register_mode == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; } ADSP_unregister_mode = (void (*)(void* HANDLE, void* CB, AE_DSP_MODES::AE_DSP_MODE *modes)) dlsym(m_libKODI_adsp, "ADSP_unregister_mode"); if (ADSP_unregister_mode == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; } ADSP_get_sound_play = (CAddonSoundPlay* (*)(void *HANDLE, void *CB, const char *filename)) dlsym(m_libKODI_adsp, "ADSP_get_sound_play"); if (ADSP_get_sound_play == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; } ADSP_release_sound_play = (void (*)(CAddonSoundPlay* p)) dlsym(m_libKODI_adsp, "ADSP_release_sound_play"); if (ADSP_release_sound_play == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; } m_Callbacks = ADSP_register_me(m_Handle); return m_Callbacks != NULL; } /*! * @brief Add or replace a menu hook for the context menu for this add-on * @param hook The hook to add */ void AddMenuHook(AE_DSP_MENUHOOK* hook) { return ADSP_add_menu_hook(m_Handle, m_Callbacks, hook); } /*! * @brief Remove a menu hook for the context menu for this add-on * @param hook The hook to remove */ void RemoveMenuHook(AE_DSP_MENUHOOK* hook) { return ADSP_remove_menu_hook(m_Handle, m_Callbacks, hook); } /*! * @brief Add or replace master mode information inside audio dsp database. * Becomes identifier written inside mode to iModeID if it was 0 (undefined) * @param mode The master mode to add or update inside database */ void RegisterMode(AE_DSP_MODES::AE_DSP_MODE* mode) { return ADSP_register_mode(m_Handle, m_Callbacks, mode); } /*! * @brief Remove a master mode from audio dsp database * @param mode The Mode to remove */ void UnregisterMode(AE_DSP_MODES::AE_DSP_MODE* mode) { return ADSP_unregister_mode(m_Handle, m_Callbacks, mode); } /*! * @brief Open a sound playing class * @param filename The wav filename to open */ CAddonSoundPlay* GetSoundPlay(const char *filename) { return ADSP_get_sound_play(m_Handle, m_Callbacks, filename); } /*! * @brief Remove a played file class * @param p The playback to remove */ void ReleaseSoundPlay(CAddonSoundPlay* p) { return ADSP_release_sound_play(p); } protected: void* (*ADSP_register_me)(void*); void (*ADSP_unregister_me)(void*, void*); void (*ADSP_add_menu_hook)(void*, void*, AE_DSP_MENUHOOK*); void (*ADSP_remove_menu_hook)(void*, void*, AE_DSP_MENUHOOK*); void (*ADSP_register_mode)(void*, void*, AE_DSP_MODES::AE_DSP_MODE*); void (*ADSP_unregister_mode)(void*, void*, AE_DSP_MODES::AE_DSP_MODE*); CAddonSoundPlay* (*ADSP_get_sound_play)(void*, void*, const char *); void (*ADSP_release_sound_play)(CAddonSoundPlay*); private: void* m_libKODI_adsp; void* m_Handle; void* m_Callbacks; struct cb_array { const char* libPath; }; }; class CAddonSoundPlay { public: CAddonSoundPlay(void *hdl, void *cb, const char *filename); virtual ~CAddonSoundPlay(); /*! play the sound this object represents */ virtual void Play(); /*! stop playing the sound this object represents */ virtual void Stop(); /*! return true if the sound is currently playing */ virtual bool IsPlaying(); /*! set the playback channel position of this sound, AE_DSP_CH_INVALID for all */ virtual void SetChannel(AE_DSP_CHANNEL channel); /*! get the current playback volume of this sound, AE_DSP_CH_INVALID for all */ virtual AE_DSP_CHANNEL GetChannel(); /*! set the playback volume of this sound */ virtual void SetVolume(float volume); /*! get the current playback volume of this sound */ virtual float GetVolume(); private: std::string m_Filename; void *m_Handle; void *m_cb; ADSPHANDLE m_PlayHandle; };