mirror of
https://github.com/hajimehoshi/ebiten.git
synced 2024-11-14 06:57:27 +01:00
230 lines
8.1 KiB
C
230 lines
8.1 KiB
C
|
/*
|
||
|
* Copyright 2016 The Android Open Source Project
|
||
|
*
|
||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||
|
* you may not use this file except in compliance with the License.
|
||
|
* You may obtain a copy of the License at
|
||
|
*
|
||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||
|
*
|
||
|
* Unless required by applicable law or agreed to in writing, software
|
||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
|
* See the License for the specific language governing permissions and
|
||
|
* limitations under the License.
|
||
|
*/
|
||
|
|
||
|
#ifndef OBOE_AAUDIO_LOADER_H_
|
||
|
#define OBOE_AAUDIO_LOADER_H_
|
||
|
|
||
|
#include <unistd.h>
|
||
|
#include "oboe_oboe_Definitions_android.h"
|
||
|
|
||
|
// If the NDK is before O then define this in your build
|
||
|
// so that AAudio.h will not be included.
|
||
|
#ifdef OBOE_NO_INCLUDE_AAUDIO
|
||
|
|
||
|
// Define missing types from AAudio.h
|
||
|
typedef int32_t aaudio_stream_state_t;
|
||
|
typedef int32_t aaudio_direction_t;
|
||
|
typedef int32_t aaudio_format_t;
|
||
|
typedef int32_t aaudio_data_callback_result_t;
|
||
|
typedef int32_t aaudio_result_t;
|
||
|
typedef int32_t aaudio_sharing_mode_t;
|
||
|
typedef int32_t aaudio_performance_mode_t;
|
||
|
|
||
|
typedef struct AAudioStreamStruct AAudioStream;
|
||
|
typedef struct AAudioStreamBuilderStruct AAudioStreamBuilder;
|
||
|
|
||
|
typedef aaudio_data_callback_result_t (*AAudioStream_dataCallback)(
|
||
|
AAudioStream *stream,
|
||
|
void *userData,
|
||
|
void *audioData,
|
||
|
int32_t numFrames);
|
||
|
|
||
|
typedef void (*AAudioStream_errorCallback)(
|
||
|
AAudioStream *stream,
|
||
|
void *userData,
|
||
|
aaudio_result_t error);
|
||
|
|
||
|
// These were defined in P
|
||
|
typedef int32_t aaudio_usage_t;
|
||
|
typedef int32_t aaudio_content_type_t;
|
||
|
typedef int32_t aaudio_input_preset_t;
|
||
|
typedef int32_t aaudio_session_id_t;
|
||
|
#else
|
||
|
#include <aaudio/AAudio.h>
|
||
|
#include <android/ndk-version.h>
|
||
|
#endif
|
||
|
|
||
|
#ifndef __NDK_MAJOR__
|
||
|
#define __NDK_MAJOR__ 0
|
||
|
#endif
|
||
|
|
||
|
namespace oboe {
|
||
|
|
||
|
|
||
|
/**
|
||
|
* The AAudio API was not available in early versions of Android.
|
||
|
* To avoid linker errors, we dynamically link with the functions by name using dlsym().
|
||
|
* On older versions this linkage will safely fail.
|
||
|
*/
|
||
|
class AAudioLoader {
|
||
|
public:
|
||
|
// Use signatures for common functions.
|
||
|
// Key to letter abbreviations.
|
||
|
// S = Stream
|
||
|
// B = Builder
|
||
|
// I = int32_t
|
||
|
// L = int64_t
|
||
|
// T = sTate
|
||
|
// K = clocKid_t
|
||
|
// P = Pointer to following data type
|
||
|
// C = Const prefix
|
||
|
// H = cHar
|
||
|
typedef int32_t (*signature_I_PPB)(AAudioStreamBuilder **builder);
|
||
|
|
||
|
typedef const char * (*signature_CPH_I)(int32_t);
|
||
|
|
||
|
typedef int32_t (*signature_I_PBPPS)(AAudioStreamBuilder *,
|
||
|
AAudioStream **stream); // AAudioStreamBuilder_open()
|
||
|
|
||
|
typedef int32_t (*signature_I_PB)(AAudioStreamBuilder *); // AAudioStreamBuilder_delete()
|
||
|
// AAudioStreamBuilder_setSampleRate()
|
||
|
typedef void (*signature_V_PBI)(AAudioStreamBuilder *, int32_t);
|
||
|
|
||
|
typedef int32_t (*signature_I_PS)(AAudioStream *); // AAudioStream_getSampleRate()
|
||
|
typedef int64_t (*signature_L_PS)(AAudioStream *); // AAudioStream_getFramesRead()
|
||
|
// AAudioStream_setBufferSizeInFrames()
|
||
|
typedef int32_t (*signature_I_PSI)(AAudioStream *, int32_t);
|
||
|
|
||
|
typedef void (*signature_V_PBPDPV)(AAudioStreamBuilder *,
|
||
|
AAudioStream_dataCallback,
|
||
|
void *);
|
||
|
|
||
|
typedef void (*signature_V_PBPEPV)(AAudioStreamBuilder *,
|
||
|
AAudioStream_errorCallback,
|
||
|
void *);
|
||
|
|
||
|
typedef aaudio_format_t (*signature_F_PS)(AAudioStream *stream);
|
||
|
|
||
|
typedef int32_t (*signature_I_PSPVIL)(AAudioStream *, void *, int32_t, int64_t);
|
||
|
typedef int32_t (*signature_I_PSCPVIL)(AAudioStream *, const void *, int32_t, int64_t);
|
||
|
|
||
|
typedef int32_t (*signature_I_PSTPTL)(AAudioStream *,
|
||
|
aaudio_stream_state_t,
|
||
|
aaudio_stream_state_t *,
|
||
|
int64_t);
|
||
|
|
||
|
typedef int32_t (*signature_I_PSKPLPL)(AAudioStream *, clockid_t, int64_t *, int64_t *);
|
||
|
|
||
|
typedef bool (*signature_B_PS)(AAudioStream *);
|
||
|
|
||
|
static AAudioLoader* getInstance(); // singleton
|
||
|
|
||
|
/**
|
||
|
* Open the AAudio shared library and load the function pointers.
|
||
|
* This can be called multiple times.
|
||
|
* It should only be called from one thread.
|
||
|
*
|
||
|
* The destructor will clean up after the open.
|
||
|
*
|
||
|
* @return 0 if successful or negative error.
|
||
|
*/
|
||
|
int open();
|
||
|
|
||
|
// Function pointers into the AAudio shared library.
|
||
|
signature_I_PPB createStreamBuilder = nullptr;
|
||
|
|
||
|
signature_I_PBPPS builder_openStream = nullptr;
|
||
|
|
||
|
signature_V_PBI builder_setBufferCapacityInFrames = nullptr;
|
||
|
signature_V_PBI builder_setChannelCount = nullptr;
|
||
|
signature_V_PBI builder_setDeviceId = nullptr;
|
||
|
signature_V_PBI builder_setDirection = nullptr;
|
||
|
signature_V_PBI builder_setFormat = nullptr;
|
||
|
signature_V_PBI builder_setFramesPerDataCallback = nullptr;
|
||
|
signature_V_PBI builder_setPerformanceMode = nullptr;
|
||
|
signature_V_PBI builder_setSampleRate = nullptr;
|
||
|
signature_V_PBI builder_setSharingMode = nullptr;
|
||
|
|
||
|
signature_V_PBI builder_setUsage = nullptr;
|
||
|
signature_V_PBI builder_setContentType = nullptr;
|
||
|
signature_V_PBI builder_setInputPreset = nullptr;
|
||
|
signature_V_PBI builder_setSessionId = nullptr;
|
||
|
|
||
|
signature_V_PBPDPV builder_setDataCallback = nullptr;
|
||
|
signature_V_PBPEPV builder_setErrorCallback = nullptr;
|
||
|
|
||
|
signature_I_PB builder_delete = nullptr;
|
||
|
|
||
|
signature_F_PS stream_getFormat = nullptr;
|
||
|
|
||
|
signature_I_PSPVIL stream_read = nullptr;
|
||
|
signature_I_PSCPVIL stream_write = nullptr;
|
||
|
|
||
|
signature_I_PSTPTL stream_waitForStateChange = nullptr;
|
||
|
|
||
|
signature_I_PSKPLPL stream_getTimestamp = nullptr;
|
||
|
|
||
|
signature_B_PS stream_isMMapUsed = nullptr;
|
||
|
|
||
|
signature_I_PS stream_close = nullptr;
|
||
|
|
||
|
signature_I_PS stream_getChannelCount = nullptr;
|
||
|
signature_I_PS stream_getDeviceId = nullptr;
|
||
|
|
||
|
signature_I_PS stream_getBufferSize = nullptr;
|
||
|
signature_I_PS stream_getBufferCapacity = nullptr;
|
||
|
signature_I_PS stream_getFramesPerBurst = nullptr;
|
||
|
signature_I_PS stream_getState = nullptr;
|
||
|
signature_I_PS stream_getPerformanceMode = nullptr;
|
||
|
signature_I_PS stream_getSampleRate = nullptr;
|
||
|
signature_I_PS stream_getSharingMode = nullptr;
|
||
|
signature_I_PS stream_getXRunCount = nullptr;
|
||
|
|
||
|
signature_I_PSI stream_setBufferSize = nullptr;
|
||
|
signature_I_PS stream_requestStart = nullptr;
|
||
|
signature_I_PS stream_requestPause = nullptr;
|
||
|
signature_I_PS stream_requestFlush = nullptr;
|
||
|
signature_I_PS stream_requestStop = nullptr;
|
||
|
|
||
|
signature_L_PS stream_getFramesRead = nullptr;
|
||
|
signature_L_PS stream_getFramesWritten = nullptr;
|
||
|
|
||
|
signature_CPH_I convertResultToText = nullptr;
|
||
|
|
||
|
signature_I_PS stream_getUsage = nullptr;
|
||
|
signature_I_PS stream_getContentType = nullptr;
|
||
|
signature_I_PS stream_getInputPreset = nullptr;
|
||
|
signature_I_PS stream_getSessionId = nullptr;
|
||
|
|
||
|
private:
|
||
|
AAudioLoader() {}
|
||
|
~AAudioLoader();
|
||
|
|
||
|
// Load function pointers for specific signatures.
|
||
|
signature_I_PPB load_I_PPB(const char *name);
|
||
|
signature_CPH_I load_CPH_I(const char *name);
|
||
|
signature_V_PBI load_V_PBI(const char *name);
|
||
|
signature_V_PBPDPV load_V_PBPDPV(const char *name);
|
||
|
signature_V_PBPEPV load_V_PBPEPV(const char *name);
|
||
|
signature_I_PB load_I_PB(const char *name);
|
||
|
signature_I_PBPPS load_I_PBPPS(const char *name);
|
||
|
signature_I_PS load_I_PS(const char *name);
|
||
|
signature_L_PS load_L_PS(const char *name);
|
||
|
signature_F_PS load_F_PS(const char *name);
|
||
|
signature_B_PS load_B_PS(const char *name);
|
||
|
signature_I_PSI load_I_PSI(const char *name);
|
||
|
signature_I_PSPVIL load_I_PSPVIL(const char *name);
|
||
|
signature_I_PSCPVIL load_I_PSCPVIL(const char *name);
|
||
|
signature_I_PSTPTL load_I_PSTPTL(const char *name);
|
||
|
signature_I_PSKPLPL load_I_PSKPLPL(const char *name);
|
||
|
|
||
|
void *mLibHandle = nullptr;
|
||
|
};
|
||
|
|
||
|
} // namespace oboe
|
||
|
|
||
|
#endif //OBOE_AAUDIO_LOADER_H_
|