/* * Copyright (C) 2014-2017 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 this Program; see the file COPYING. If not, see * . * */ #pragma once #include "libXBMC_addon.h" #include "kodi_game_types.h" #include #include #if defined(ANDROID) #include #endif class CHelper_libKODI_game { public: CHelper_libKODI_game(void) : m_handle(nullptr), m_callbacks(nullptr) { } ~CHelper_libKODI_game(void) { } /*! * @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 = static_cast(handle); if (m_handle) m_callbacks = (AddonInstance_Game*)m_handle->GameLib_RegisterMe(m_handle->addonData); if (!m_callbacks) fprintf(stderr, "libKODI_game-ERROR: GameLib_RegisterMe can't get callback table from Kodi !!!\n"); return m_callbacks != nullptr; } // --- Game callbacks -------------------------------------------------------- /*! * \brief Requests the frontend to stop the current game */ void CloseGame(void) { return m_callbacks->toKodi.CloseGame(m_callbacks->toKodi.kodiInstance); } /*! * \brief Create a video stream for pixel data * * \param format The type of pixel data accepted by this stream * \param width The frame width * \param height The frame height * \param rotation The rotation (counter-clockwise) of the video frames * * \return 0 on success or -1 if a video stream is already created */ bool OpenPixelStream(GAME_PIXEL_FORMAT format, unsigned int width, unsigned int height, GAME_VIDEO_ROTATION rotation) { return m_callbacks->toKodi.OpenPixelStream(m_callbacks->toKodi.kodiInstance, format, width, height, rotation) == 0; } /*! * \brief Create a video stream for encoded video data * * \param codec The video format accepted by this stream * * \return 0 on success or -1 if a video stream is already created */ bool OpenVideoStream(GAME_VIDEO_CODEC codec) { return m_callbacks->toKodi.OpenVideoStream(m_callbacks->toKodi.kodiInstance, codec) == 0; } /*! * \brief Create an audio stream for PCM audio data * * \param format The type of audio data accepted by this stream * \param channel_map The channel layout terminated by GAME_CH_NULL * * \return 0 on success or -1 if an audio stream is already created */ bool OpenPCMStream(GAME_PCM_FORMAT format, const GAME_AUDIO_CHANNEL* channel_map) { return m_callbacks->toKodi.OpenPCMStream(m_callbacks->toKodi.kodiInstance, format, channel_map) == 0; } /*! * \brief Create an audio stream for encoded audio data * * \param codec The audio format accepted by this stream * \param channel_map The channel layout terminated by GAME_CH_NULL * * \return 0 on success or -1 if an audio stream is already created */ bool OpenAudioStream(GAME_AUDIO_CODEC codec, const GAME_AUDIO_CHANNEL* channel_map) { return m_callbacks->toKodi.OpenAudioStream(m_callbacks->toKodi.kodiInstance, codec, channel_map) == 0; } /*! * \brief Add a data packet to an audio or video stream * * \param stream The target stream * \param data The data packet * \param size The size of the data */ void AddStreamData(GAME_STREAM_TYPE stream, const uint8_t* data, unsigned int size) { m_callbacks->toKodi.AddStreamData(m_callbacks->toKodi.kodiInstance, stream, data, size); } /*! * \brief Free the specified stream * * \param stream The stream to close */ void CloseStream(GAME_STREAM_TYPE stream) { m_callbacks->toKodi.CloseStream(m_callbacks->toKodi.kodiInstance, stream); } // -- Hardware rendering callbacks ------------------------------------------- /*! * \brief Enable hardware rendering * * \param hw_info A struct of properties for the hardware rendering system */ void EnableHardwareRendering(const struct game_hw_info* hw_info) { return m_callbacks->toKodi.EnableHardwareRendering(m_callbacks->toKodi.kodiInstance, hw_info); } /*! * \brief Get the framebuffer for rendering * * \return The framebuffer */ uintptr_t HwGetCurrentFramebuffer(void) { return m_callbacks->toKodi.HwGetCurrentFramebuffer(m_callbacks->toKodi.kodiInstance); } /*! * \brief Get a symbol from the hardware context * * \param symbol The symbol's name * * \return A function pointer for the specified symbol */ game_proc_address_t HwGetProcAddress(const char* sym) { return m_callbacks->toKodi.HwGetProcAddress(m_callbacks->toKodi.kodiInstance, sym); } /*! * \brief Called when a frame is being rendered */ void RenderFrame() { return m_callbacks->toKodi.RenderFrame(m_callbacks->toKodi.kodiInstance); } // --- Input callbacks ------------------------------------------------------- /*! * \brief Begin reporting events for the specified joystick port * * \param port The zero-indexed port number * * \return true if the port was opened, false otherwise */ bool OpenPort(unsigned int port) { return m_callbacks->toKodi.OpenPort(m_callbacks->toKodi.kodiInstance, port); } /*! * \brief End reporting events for the specified port * * \param port The port number passed to OpenPort() */ void ClosePort(unsigned int port) { return m_callbacks->toKodi.ClosePort(m_callbacks->toKodi.kodiInstance, port); } /*! * \brief Notify the port of an input event * * \param event The input event * * Input events can arrive for the following sources: * - GAME_INPUT_EVENT_MOTOR * * \return true if the event was handled, false otherwise */ bool InputEvent(const game_input_event& event) { return m_callbacks->toKodi.InputEvent(m_callbacks->toKodi.kodiInstance, &event); } private: AddonCB* m_handle; AddonInstance_Game* m_callbacks; };