diff --git a/libs/linux-aarch64/libbassenc.so b/libs/linux-aarch64/libbassenc.so new file mode 100644 index 0000000..82fb7be Binary files /dev/null and b/libs/linux-aarch64/libbassenc.so differ diff --git a/libs/linux-armhf/libbassenc.so b/libs/linux-armhf/libbassenc.so new file mode 100644 index 0000000..20016ee Binary files /dev/null and b/libs/linux-armhf/libbassenc.so differ diff --git a/libs/linux-x86-64/libbassenc.so b/libs/linux-x86-64/libbassenc.so new file mode 100644 index 0000000..bb7240b Binary files /dev/null and b/libs/linux-x86-64/libbassenc.so differ diff --git a/libs/linux-x86/libbassenc.so b/libs/linux-x86/libbassenc.so new file mode 100644 index 0000000..874faee Binary files /dev/null and b/libs/linux-x86/libbassenc.so differ diff --git a/libs/win32-arm64/bassenc.dll b/libs/win32-arm64/bassenc.dll new file mode 100644 index 0000000..74be787 Binary files /dev/null and b/libs/win32-arm64/bassenc.dll differ diff --git a/libs/win32-x86-64/bassenc.dll b/libs/win32-x86-64/bassenc.dll new file mode 100644 index 0000000..b8f6960 Binary files /dev/null and b/libs/win32-x86-64/bassenc.dll differ diff --git a/libs/win32-x86/bassenc.dll b/libs/win32-x86/bassenc.dll new file mode 100644 index 0000000..d61ca83 Binary files /dev/null and b/libs/win32-x86/bassenc.dll differ diff --git a/src/audio/AudioPlayer.kt b/src/audio/AudioPlayer.kt index feacfb6..0c0b730 100644 --- a/src/audio/AudioPlayer.kt +++ b/src/audio/AudioPlayer.kt @@ -1,5 +1,6 @@ package audio +import audio.Bass.BASS_ACTIVE_PLAYING import audio.Bass.BASS_DEVICE_ENABLED import audio.Bass.BASS_DEVICE_INIT import audio.Bass.BASS_POS_BYTE @@ -137,32 +138,60 @@ class AudioPlayer (var samplingrate: Int) { return } - bass.BASS_SetDevice(0) // Set to No Sound device for writing - val streamhandle = bass.BASS_StreamCreate(samplingrate, 1, BASS_STREAM_DECODE, STREAMPROC_PUSH, null) - if (streamhandle==0){ - callback.accept(false, "Failed to create stream: ${bass.BASS_ErrorGetCode()}") - return - } - val encodehandle = bassenc.BASS_Encode_Start(streamhandle, target, BASS_ENCODE_PCM, null, null) - if (encodehandle==0){ - bass.BASS_StreamFree(streamhandle) - callback.accept(false, "Failed to start encoding: ${bass.BASS_ErrorGetCode()}") - return - } - val playresult = bass.BASS_ChannelPlay(streamhandle,false) - if (!playresult) { + val thread = Thread { + bass.BASS_SetDevice(0) // Set to No Sound device for writing + val streamhandle = bass.BASS_StreamCreate(samplingrate, 1, BASS_STREAM_DECODE, STREAMPROC_PUSH, null) + if (streamhandle==0){ + callback.accept(false, "Failed to create stream: ${bass.BASS_ErrorGetCode()}") + return@Thread + } + val encodehandle = bassenc.BASS_Encode_Start(streamhandle, target, BASS_ENCODE_PCM, null, null) + if (encodehandle==0){ + bass.BASS_StreamFree(streamhandle) + callback.accept(false, "Failed to start encoding: ${bass.BASS_ErrorGetCode()}") + return@Thread + } + val playresult = bass.BASS_ChannelPlay(streamhandle,false) + if (!playresult) { + bassenc.BASS_Encode_Stop(encodehandle) + bass.BASS_StreamFree(streamhandle) + callback.accept(false, "BASS_ChannelPlay failed: ${bass.BASS_ErrorGetCode()}") + return@Thread + } + + var allsuccess = true + sources.forEach { source -> + if (source.isValid()) { + // write the bytes to the stream + val mem = Memory(source.bytes.size.toLong()) + mem.write(0, source.bytes, 0, source.bytes.size) + val pushresult = bass.BASS_StreamPutData(streamhandle, mem, source.bytes.size) + if (pushresult == -1) { + Logger.error { "Failed to write data from ${source.fileName} to stream: ${bass.BASS_ErrorGetCode()}" } + allsuccess = false + } + } + } + + // now we wait until the stream is finished + while(bassenc.BASS_Encode_IsActive(encodehandle) == BASS_ACTIVE_PLAYING) { + Thread.sleep(100) // Sleep for a short time to avoid busy waiting + } + + // close the encoding handle bassenc.BASS_Encode_Stop(encodehandle) - bass.BASS_StreamFree(streamhandle) - callback.accept(false, "BASS_ChannelPlay failed: ${bass.BASS_ErrorGetCode()}") - return + bass.BASS_ChannelFree(streamhandle) + if (allsuccess){ + callback.accept(true, "WAV file written successfully: $target") + } else { + callback.accept(false, "Failed to write some data to WAV file: $target") + } } + thread.name = "WavWriter Thread" + thread.isDaemon = true + thread.start() - // TODO write each source to the stream - // close the encoding handle - bassenc.BASS_Encode_Stop(encodehandle) - bass.BASS_ChannelFree(streamhandle) - callback.accept(true, "WAV file written successfully: $target") } diff --git a/src/audio/BassEnc.java b/src/audio/BassEnc.java index de43b0f..63c9038 100644 --- a/src/audio/BassEnc.java +++ b/src/audio/BassEnc.java @@ -126,4 +126,5 @@ public interface BassEnc extends Library { int BASS_Encode_IsActive(int handle); boolean BASS_Encode_SetPaused(int handle, boolean paused); int BASS_Encode_GetChannel(int handle); + boolean BASS_Encode_StopEx(int handle, boolean queue); }