/* * Copyright 2019 Google LLC * * 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 * * https://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. */ package com.mobileer.androidfxlab import android.util.Log import com.mobileer.androidfxlab.datatype.Effect import com.mobileer.androidfxlab.datatype.EffectDescription object NativeInterface { // Used to load the 'native-lib' library on application startup. val effectDescriptionMap: Map init { System.loadLibrary("native-lib") effectDescriptionMap = getEffects() .associateBy { it.name } Log.d("MAP", effectDescriptionMap.toString()) } // Functions/Members called by UI code // Adds effect at end of effect list fun addEffect(effect: Effect) { Log.d("INTERFACE", String.format("Effect %s added", effect.name)) addDefaultEffectNative( convertEffectToId( effect ) ) } // Enables effect at index fun enableEffectAt(turnOn: Boolean, index: Int) { Log.d("INTERFACE", String.format("Effect %b at index %d", turnOn, index)) enableEffectNative(index, turnOn) } // Signals params were updated at index fun updateParamsAt(effect: Effect, index: Int) { Log.d( "INTERFACE", String.format( "Params were updated at index %d to %f", index, effect.paramValues[0] ) ) modifyEffectNative( convertEffectToId( effect ), index, effect.paramValues ) } // Removes effect at index fun removeEffectAt(index: Int) { Log.d("INTERFACE", String.format("Effect was removed at index %d", index)) removeEffectNative(index) } // Rotates existing effect from index to another fun rotateEffectAt(from: Int, to: Int) { Log.d("INTERFACE", String.format("Effect was rotated from %d to %d", from, to)) rotateEffectNative(from, to) } fun enable(enable: Boolean) { Log.d("INTERFACE", "Enabling effects: $enable") enablePassthroughNative(enable) } // State of audio engine external fun createAudioEngine() external fun destroyAudioEngine() // These functions populate effectDescriptionMap private external fun getEffects(): Array // These functions mutate the function list // Adds effect at index private external fun addDefaultEffectNative(id: Int) private external fun removeEffectNative(index: Int) private external fun rotateEffectNative(from: Int, to: Int) private external fun modifyEffectNative(id: Int, index: Int, params: FloatArray) private external fun enableEffectNative(index: Int, enable: Boolean) private external fun enablePassthroughNative(enable: Boolean) // These are utility functions private fun convertEffectToId(effect: Effect): Int = effectDescriptionMap[effect.name]?.id ?: -1 }