add some functionality to the instruments by making their sound toggleable
1 parent 844d787 commit 6e52a8e7753ee3fa891fc4888a42deeb507ea71a
@lukas lukas authored on 5 Aug 2022
Showing 19 changed files
View
25
app/src/main/cpp/AndroidBridge.cpp 100644 → 0
#include <jni.h>
#include <android/input.h>
#include "AudioEngine.h"
#include <jni.h>
#include <string>
 
static AudioEngine *audioEngine;
 
extern "C" {
 
JNIEXPORT void JNICALL
Java_com_lukas_music_MainActivity_00024Companion_startAudio(JNIEnv *env, jobject activity) {
audioEngine = new AudioEngine();
}
 
JNIEXPORT void JNICALL
Java_com_lukas_music_MainActivity_00024Companion_muteAudio(JNIEnv *env, jobject activity, float volume) {
audioEngine->stop();
}
 
JNIEXPORT void JNICALL
Java_com_lukas_music_MainActivity_00024Companion_unmuteAudio(JNIEnv *env, jobject activity, float volume) {
audioEngine->start();
}
}
View
62
app/src/main/cpp/AudioHost.cpp 0 → 100644
#include "AudioHost.h"
#include <android/log.h>
#include <thread>
#include <mutex>
 
const uint32_t bufferSize = 2;
static uint32_t sampleCount;
static float *buffer;
 
void renderInstrument(Instrument * instrument) {
instrument->render(buffer, sampleCount);
}
 
aaudio_data_callback_result_t dataCallback(
AAudioStream *stream,
void *userData,
void *audioData,
int32_t _sampleCount) {
sampleCount = _sampleCount;
buffer = static_cast<float*>(audioData);
for (uint32_t i = 0; i < _sampleCount; i++) {
buffer[i] = 0;
}
AudioHost *thiz = static_cast<AudioHost *>(userData);
std::for_each(thiz->instruments->begin(), thiz->instruments->end(), renderInstrument);
return AAUDIO_CALLBACK_RESULT_CONTINUE;
}
 
void errorCallback(AAudioStream *stream, void *data, aaudio_result_t error) {
__android_log_print(ANDROID_LOG_ERROR, "AudioHost", "an error occurred");
}
 
AudioHost::AudioHost() {
AAudioStreamBuilder *streamBuilder;
AAudio_createStreamBuilder(&streamBuilder);
AAudioStreamBuilder_setFormat(streamBuilder, AAUDIO_FORMAT_PCM_FLOAT);
AAudioStreamBuilder_setChannelCount(streamBuilder, 1);
AAudioStreamBuilder_setPerformanceMode(streamBuilder, AAUDIO_PERFORMANCE_MODE_LOW_LATENCY);
AAudioStreamBuilder_setDataCallback(streamBuilder, ::dataCallback, this);
AAudioStreamBuilder_setErrorCallback(streamBuilder, ::errorCallback, this);
 
aaudio_result_t result = AAudioStreamBuilder_openStream(streamBuilder, &stream);
if (result != AAUDIO_OK) {
__android_log_print(ANDROID_LOG_ERROR, "AudioHost", "Error opening stream %s",
AAudio_convertResultToText(result));
return;
}
 
this->sampleRate = AAudioStream_getSampleRate(stream);
 
AAudioStream_setBufferSizeInFrames(
stream, AAudioStream_getFramesPerBurst(stream) * bufferSize);
 
result = AAudioStream_requestStart(stream);
if (result != AAUDIO_OK) {
__android_log_print(ANDROID_LOG_ERROR, "AudioHost", "Error starting stream %s",
AAudio_convertResultToText(result));
return;
}
 
AAudioStreamBuilder_delete(streamBuilder);
}
View
app/src/main/cpp/AudioHost.h 0 → 100644
View
app/src/main/cpp/CMakeLists.txt
View
app/src/main/cpp/Instrument.cpp 0 → 100644
View
app/src/main/cpp/Instrument.h 0 → 100644
View
app/src/main/cpp/JavaFunctions.cpp 0 → 100644
View
app/src/main/cpp/SineWave.cpp
View
app/src/main/cpp/SineWave.h
View
app/src/main/cpp/native-lib.cpp 100644 → 0
View
app/src/main/java/com/lukas/music/InstrumentView.kt 100644 → 0
View
app/src/main/java/com/lukas/music/MainActivity.kt
View
app/src/main/java/com/lukas/music/instruments/Instrument.kt
View
app/src/main/java/com/lukas/music/ui/InstrumentAdapter.kt
View
app/src/main/java/com/lukas/music/ui/fragments/InstrumentFragment.kt
View
app/src/main/java/com/lukas/music/ui/fragments/PlayFragment.kt
View
app/src/main/res/layout/fragment_instrument.xml
View
app/src/main/res/layout/fragment_instrument_list.xml
View
app/src/main/res/layout/sample_instrument_view.xml 100644 → 0