commit 07/10/2025
This commit is contained in:
@@ -6,17 +6,14 @@ import audio.Bass.BASS_POS_BYTE
|
||||
import audio.Bass.BASS_STREAM_DECODE
|
||||
import audio.Bass.BASS_SAMPLE_MONO
|
||||
import audio.BassEnc.BASS_ENCODE_PCM
|
||||
import codes.Result_Boolean_String
|
||||
import codes.Somecodes.Companion.ValidFile
|
||||
import codes.Somecodes.Companion.ValidString
|
||||
import com.sun.jna.Memory
|
||||
import com.sun.jna.Pointer
|
||||
import contentCache
|
||||
import kotlinx.coroutines.CoroutineName
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.launch
|
||||
|
||||
import org.tinylog.Logger
|
||||
import java.util.function.BiConsumer
|
||||
|
||||
@Suppress("unused")
|
||||
class AudioPlayer (var samplingrate: Int) {
|
||||
@@ -131,84 +128,87 @@ class AudioPlayer (var samplingrate: Int) {
|
||||
* @param data The byte array containing the audio data.
|
||||
* @param target The target file name for the WAV file.
|
||||
* @param withChime If true, adds a chime sound at the beginning and end of the audio.
|
||||
* @param callback A BiConsumer that accepts a Boolean indicating success or failure and a String message.
|
||||
* @return A Result_Boolean_String indicating success or failure and a message.
|
||||
*/
|
||||
fun WavWriter(data: ByteArray, target: String, withChime: Boolean = true, callback: BiConsumer<Boolean, String>) {
|
||||
CoroutineScope(Dispatchers.IO).launch {
|
||||
bass.BASS_SetDevice(0) // Set to No Sound device for writing
|
||||
val streamhandle = bass.BASS_StreamCreate(samplingrate, 1, BASS_STREAM_DECODE, Pointer(-1), null)
|
||||
fun WavWriter(data: ByteArray, target: String, withChime: Boolean = true) : Result_Boolean_String {
|
||||
bass.BASS_SetDevice(0) // Set to No Sound device for writing
|
||||
val streamhandle = bass.BASS_StreamCreate(samplingrate, 1, BASS_STREAM_DECODE, Pointer(-1), null)
|
||||
|
||||
if (streamhandle!=0){
|
||||
val encodehandle = bassenc.BASS_Encode_Start(streamhandle, target, BASS_ENCODE_PCM, null, null)
|
||||
if (encodehandle!=0){
|
||||
if (streamhandle!=0){
|
||||
val encodehandle = bassenc.BASS_Encode_Start(streamhandle, target, BASS_ENCODE_PCM, null, null)
|
||||
if (encodehandle!=0){
|
||||
|
||||
fun pushData(data: ByteArray): Boolean {
|
||||
val mem = Memory(data.size.toLong())
|
||||
mem.write(0, data, 0, data.size)
|
||||
val pushresult = bass.BASS_StreamPutData(streamhandle, mem, data.size)
|
||||
if (pushresult==-1){
|
||||
val errcode = bass.BASS_ErrorGetCode()
|
||||
println("BASS_StreamPutData failed: $errcode")
|
||||
fun pushData(data: ByteArray): Boolean {
|
||||
val mem = Memory(data.size.toLong())
|
||||
mem.write(0, data, 0, data.size)
|
||||
val pushresult = bass.BASS_StreamPutData(streamhandle, mem, data.size)
|
||||
if (pushresult==-1){
|
||||
val errcode = bass.BASS_ErrorGetCode()
|
||||
println("BASS_StreamPutData failed: $errcode")
|
||||
}
|
||||
return pushresult != -1
|
||||
}
|
||||
|
||||
var all_success = true
|
||||
|
||||
if (withChime){
|
||||
val chup = contentCache.getAudioFile("chimeup")
|
||||
if (chup!=null && chup.isValid()){
|
||||
if (pushData(chup.bytes)){
|
||||
println("Chime up pushed")
|
||||
} else {
|
||||
all_success = false
|
||||
println("Chime up failed")
|
||||
}
|
||||
return pushresult != -1
|
||||
}
|
||||
} else println("Chime Up not valid")
|
||||
}
|
||||
|
||||
var all_success = true
|
||||
if (pushData(data)){
|
||||
println("Data pushed")
|
||||
} else {
|
||||
all_success = false
|
||||
println("Data push failed")
|
||||
}
|
||||
|
||||
if (withChime){
|
||||
val chup = contentCache.getAudioFile("chimeup")
|
||||
if (chup!=null && chup.isValid()){
|
||||
if (pushData(chup.bytes)){
|
||||
println("Chime up pushed")
|
||||
} else {
|
||||
all_success = false
|
||||
println("Chime up failed")
|
||||
}
|
||||
} else println("Chime Up not valid")
|
||||
}
|
||||
|
||||
if (pushData(data)){
|
||||
println("Data pushed")
|
||||
} else {
|
||||
all_success = false
|
||||
println("Data push failed")
|
||||
}
|
||||
|
||||
if (withChime){
|
||||
val chdn = contentCache.getAudioFile("chimedown")
|
||||
if (chdn!=null && chdn.isValid()){
|
||||
if (pushData(chdn.bytes)){
|
||||
println("Chime down pushed")
|
||||
} else {
|
||||
all_success = false
|
||||
println("Chime down failed")
|
||||
}
|
||||
} else println("Chime Down not valid")
|
||||
}
|
||||
|
||||
val readsize: Long = 1024 * 1024 // read 1 MB at a time
|
||||
var totalread: Long = 0
|
||||
do{
|
||||
val p = Memory(readsize)
|
||||
val read = bass.BASS_ChannelGetData(streamhandle, p, 4096)
|
||||
if (read > 0) {
|
||||
totalread += read
|
||||
if (withChime){
|
||||
val chdn = contentCache.getAudioFile("chimedown")
|
||||
if (chdn!=null && chdn.isValid()){
|
||||
if (pushData(chdn.bytes)){
|
||||
println("Chime down pushed")
|
||||
} else {
|
||||
all_success = false
|
||||
println("Chime down failed")
|
||||
}
|
||||
} while (read > 0)
|
||||
println("Finished reading stream data, total $totalread bytes read")
|
||||
} else println("Chime Down not valid")
|
||||
}
|
||||
|
||||
if (all_success){
|
||||
callback.accept(true, "WAV file written successfully: $target")
|
||||
} else {
|
||||
callback.accept(false, "Failed to write some data to WAV file: $target")
|
||||
val readsize: Long = 1024 * 1024 // read 1 MB at a time
|
||||
var totalread: Long = 0
|
||||
do{
|
||||
val p = Memory(readsize)
|
||||
val read = bass.BASS_ChannelGetData(streamhandle, p, 4096)
|
||||
if (read > 0) {
|
||||
totalread += read
|
||||
}
|
||||
|
||||
bassenc.BASS_Encode_Stop(encodehandle)
|
||||
} else callback.accept(false, "Failed to start encoding: ${bass.BASS_ErrorGetCode()}")
|
||||
} while (read > 0)
|
||||
println("Finished reading stream data, total $totalread bytes read")
|
||||
bassenc.BASS_Encode_Stop(encodehandle)
|
||||
bass.BASS_StreamFree(streamhandle)
|
||||
|
||||
return if (all_success){
|
||||
Result_Boolean_String(true, "WAV file written successfully: $target")
|
||||
} else {
|
||||
Result_Boolean_String(false, "Failed to write some data to WAV file: $target")
|
||||
}
|
||||
|
||||
|
||||
} else {
|
||||
callback.accept(false, "Failed to create stream: ${bass.BASS_ErrorGetCode()}")
|
||||
bass.BASS_StreamFree(streamhandle)
|
||||
return Result_Boolean_String(false, "Failed to start encoding: ${bass.BASS_ErrorGetCode()}")
|
||||
}
|
||||
|
||||
} else {
|
||||
return Result_Boolean_String(false, "Failed to create stream: ${bass.BASS_ErrorGetCode()}")
|
||||
}
|
||||
|
||||
|
||||
@@ -220,107 +220,102 @@ class AudioPlayer (var samplingrate: Int) {
|
||||
* @param sources List of AudioFileInfo objects containing the audio data to write.
|
||||
* @param target The target file name for the WAV file.
|
||||
* @param withChime If true, adds a chime sound at the beginning and end of the audio.
|
||||
* @param callback A BiConsumer that accepts a Boolean indicating success or failure and a String message.
|
||||
* @return A Result_Boolean_String indicating success or failure and a message.
|
||||
*/
|
||||
fun WavWriter(sources: List<AudioFileInfo>, target: String, withChime: Boolean = true, callback: BiConsumer<Boolean, String>) {
|
||||
fun WavWriter(sources: List<AudioFileInfo>, target: String, withChime: Boolean = true) : Result_Boolean_String {
|
||||
if (sources.isEmpty()) {
|
||||
callback.accept(false, " Invalid sources")
|
||||
return
|
||||
return Result_Boolean_String(false,"Invalid Source")
|
||||
}
|
||||
if (!ValidString(target)) {
|
||||
callback.accept(false, " Invalid target file name")
|
||||
return
|
||||
return Result_Boolean_String(false, " Invalid target file name")
|
||||
}
|
||||
|
||||
bass.BASS_SetDevice(0) // Set to No Sound device for writing
|
||||
val streamhandle = bass.BASS_StreamCreate(samplingrate, 1, BASS_STREAM_DECODE, Pointer(-1), null)
|
||||
if (streamhandle==0){
|
||||
return Result_Boolean_String(false, "Failed to create stream: ${bass.BASS_ErrorGetCode()}")
|
||||
}
|
||||
val encodehandle = bassenc.BASS_Encode_Start(streamhandle, target, BASS_ENCODE_PCM, null, null)
|
||||
if (encodehandle==0){
|
||||
bass.BASS_StreamFree(streamhandle)
|
||||
return Result_Boolean_String(false, "Failed to start encoding: ${bass.BASS_ErrorGetCode()}")
|
||||
}
|
||||
|
||||
fun pushData(data: ByteArray): Boolean {
|
||||
val mem = Memory(data.size.toLong())
|
||||
mem.write(0, data, 0, data.size)
|
||||
val pushresult = bass.BASS_StreamPutData(streamhandle, mem, data.size)
|
||||
if (pushresult==-1){
|
||||
val errcode = bass.BASS_ErrorGetCode()
|
||||
println("BASS_StreamPutData failed: $errcode")
|
||||
}
|
||||
return pushresult != -1
|
||||
}
|
||||
|
||||
|
||||
CoroutineScope(Dispatchers.IO).launch(CoroutineName("WavWriter $target")) {
|
||||
bass.BASS_SetDevice(0) // Set to No Sound device for writing
|
||||
val streamhandle = bass.BASS_StreamCreate(samplingrate, 1, BASS_STREAM_DECODE, Pointer(-1), null)
|
||||
if (streamhandle==0){
|
||||
callback.accept(false, "Failed to create stream: ${bass.BASS_ErrorGetCode()}")
|
||||
return@launch
|
||||
}
|
||||
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@launch
|
||||
}
|
||||
|
||||
fun pushData(data: ByteArray): Boolean {
|
||||
val mem = Memory(data.size.toLong())
|
||||
mem.write(0, data, 0, data.size)
|
||||
val pushresult = bass.BASS_StreamPutData(streamhandle, mem, data.size)
|
||||
if (pushresult==-1){
|
||||
val errcode = bass.BASS_ErrorGetCode()
|
||||
println("BASS_StreamPutData failed: $errcode")
|
||||
}
|
||||
return pushresult != -1
|
||||
}
|
||||
|
||||
|
||||
|
||||
var allsuccess = true
|
||||
if (withChime){
|
||||
val chup = contentCache.getAudioFile("chimeup")
|
||||
if (chup!=null && chup.isValid()){
|
||||
if (pushData(chup.bytes)){
|
||||
println("Chime up pushed")
|
||||
} else {
|
||||
allsuccess = false
|
||||
println("Chime up failed")
|
||||
}
|
||||
} else println("Chime Up not valid")
|
||||
}
|
||||
sources.forEach { source ->
|
||||
if (source.isValid()) {
|
||||
// write the bytes to the stream
|
||||
if (pushData(source.bytes)){
|
||||
println("Source ${source.fileName} pushed")
|
||||
} else {
|
||||
allsuccess = false
|
||||
println("Source ${source.fileName} push failed")
|
||||
}
|
||||
var allsuccess = true
|
||||
if (withChime){
|
||||
val chup = contentCache.getAudioFile("chimeup")
|
||||
if (chup!=null && chup.isValid()){
|
||||
if (pushData(chup.bytes)){
|
||||
println("Chime up pushed")
|
||||
} else {
|
||||
allsuccess = false
|
||||
println("Source ${source.fileName} is not valid")
|
||||
println("Chime up failed")
|
||||
}
|
||||
|
||||
}
|
||||
if (withChime){
|
||||
val chdn = contentCache.getAudioFile("chimedown")
|
||||
if (chdn!=null && chdn.isValid()){
|
||||
if (pushData(chdn.bytes)){
|
||||
println("Chime down pushed")
|
||||
} else {
|
||||
allsuccess = false
|
||||
println("Chime down failed")
|
||||
}
|
||||
} else println("Chime Down not valid")
|
||||
}
|
||||
|
||||
val readsize: Long = 1024 * 1024 // read 1 MB at a time
|
||||
var totalread: Long = 0
|
||||
do{
|
||||
val p = Memory(readsize)
|
||||
val read = bass.BASS_ChannelGetData(streamhandle, p, 4096)
|
||||
if (read > 0) {
|
||||
totalread += read
|
||||
}
|
||||
} while (read > 0)
|
||||
println("Finished reading stream data, total $totalread bytes read")
|
||||
|
||||
|
||||
// close the encoding handle
|
||||
bassenc.BASS_Encode_Stop(encodehandle)
|
||||
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")
|
||||
}
|
||||
} else println("Chime Up not valid")
|
||||
}
|
||||
sources.forEach { source ->
|
||||
if (source.isValid()) {
|
||||
// write the bytes to the stream
|
||||
if (pushData(source.bytes)){
|
||||
println("Source ${source.fileName} pushed")
|
||||
} else {
|
||||
allsuccess = false
|
||||
println("Source ${source.fileName} push failed")
|
||||
}
|
||||
} else {
|
||||
allsuccess = false
|
||||
println("Source ${source.fileName} is not valid")
|
||||
}
|
||||
|
||||
}
|
||||
if (withChime){
|
||||
val chdn = contentCache.getAudioFile("chimedown")
|
||||
if (chdn!=null && chdn.isValid()){
|
||||
if (pushData(chdn.bytes)){
|
||||
println("Chime down pushed")
|
||||
} else {
|
||||
allsuccess = false
|
||||
println("Chime down failed")
|
||||
}
|
||||
} else println("Chime Down not valid")
|
||||
}
|
||||
|
||||
val readsize: Long = 1024 * 1024 // read 1 MB at a time
|
||||
var totalread: Long = 0
|
||||
do{
|
||||
val p = Memory(readsize)
|
||||
val read = bass.BASS_ChannelGetData(streamhandle, p, 4096)
|
||||
if (read > 0) {
|
||||
totalread += read
|
||||
}
|
||||
} while (read > 0)
|
||||
println("Finished reading stream data, total $totalread bytes read")
|
||||
|
||||
|
||||
// close the encoding handle
|
||||
bassenc.BASS_Encode_Stop(encodehandle)
|
||||
bass.BASS_ChannelFree(streamhandle)
|
||||
return if (allsuccess){
|
||||
|
||||
Result_Boolean_String(true, "WAV file written successfully: $target")
|
||||
} else {
|
||||
Result_Boolean_String(false, "Failed to write some data to WAV file: $target")
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user