// // CreateTrack // private void CreateTrack(bool tryRelease) { int numToWrite, numWritten; if (effect.dataArray is sbyte[] byteData) { numToWrite = byteData.Length; track = new android.media.AudioTrack( android.media.AudioManager.STREAM_MUSIC, effect.sampleRate, effect.channelConfig, android.media.AudioFormat.ENCODING_PCM_8BIT, numToWrite, android.media.AudioTrack.MODE_STATIC); numWritten = track.write(byteData, 0, numToWrite); } else if (effect.dataArray is short[] shortData) { numToWrite = shortData.Length; track = new android.media.AudioTrack( android.media.AudioManager.STREAM_MUSIC, effect.sampleRate, effect.channelConfig, android.media.AudioFormat.ENCODING_PCM_16BIT, numToWrite * 2, android.media.AudioTrack.MODE_STATIC); numWritten = track.write(shortData, 0, numToWrite); } else { numToWrite = 0; numWritten = android.media.AudioTrack.ERROR_INVALID_OPERATION; } if (numWritten != numToWrite) { track = null; if (numWritten < 0) { if (SoundEffect.ReleaseInstance()) { CreateTrack(false); } } if (track == null) { GameRunner.Log($"SoundEffectInstance '{effect.Name}' error {numWritten}/{numToWrite}"); } return; } track.setNotificationMarkerPosition(effect.markerFrame); track.setPlaybackPositionUpdateListener(watcher = new SoundEffectInstanceWatcher()); }