From 9fc8b732737f139d3e466510d75668ab45578960 Mon Sep 17 00:00:00 2001 From: manuel Date: Tue, 8 Mar 2016 21:02:53 +0100 Subject: sync with upstream --- .../kodi-addon-dev-kit/include/kodi/libKODI_adsp.h | 232 +++++++++++++++++++++ 1 file changed, 232 insertions(+) create mode 100644 xbmc/addons/kodi-addon-dev-kit/include/kodi/libKODI_adsp.h (limited to 'xbmc/addons/kodi-addon-dev-kit/include/kodi/libKODI_adsp.h') diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/libKODI_adsp.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/libKODI_adsp.h new file mode 100644 index 0000000..46e34a6 --- /dev/null +++ b/xbmc/addons/kodi-addon-dev-kit/include/kodi/libKODI_adsp.h @@ -0,0 +1,232 @@ +#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; +}; -- cgit v1.2.3