option for speaker/headphone selection for appropriate panning

This commit is contained in:
minjaesong
2024-01-14 19:37:41 +09:00
parent 871396cd92
commit e89e32eeea
6 changed files with 30 additions and 6 deletions

View File

@@ -48,6 +48,9 @@
"MENU_OPTIONS_SAVEFORMAT": "Savegame Format",
"MENU_OPTIONS_SAVEFORMAT_FAST": "Faster Load",
"MENU_OPTIONS_SAVEFORMAT_SMALL": "Smaller Size",
"MENU_OPTIONS_SPEAKER_HEADPHONE": "Headphone",
"MENU_OPTIONS_SPEAKER_SETUP": "Speaker Setup",
"MENU_OPTIONS_SPEAKER_STEREO": "Stereo",
"MENU_OPTIONS_STREAMERS_LAYOUT": "Chat Overlay",
"MENU_CREDIT_GPL_DNT" : "GPL",

View File

@@ -48,5 +48,8 @@
"MENU_OPTIONS_SAVEFORMAT": "게임 저장 형식",
"MENU_OPTIONS_SAVEFORMAT_FAST": "빠른 불러오기",
"MENU_OPTIONS_SAVEFORMAT_SMALL": "작은 용량",
"MENU_OPTIONS_SPEAKER_HEADPHONE": "헤드폰",
"MENU_OPTIONS_SPEAKER_SETUP": "스피커 구성",
"MENU_OPTIONS_SPEAKER_STEREO": "스테레오",
"MENU_OPTIONS_STREAMERS_LAYOUT": "채팅창 오버레이"
}

View File

@@ -25,6 +25,7 @@ object DefaultConfig {
"audio_buffer_size" to 512,
"audio_dynamic_source_max" to 128,
"audio_speaker_setup" to "headphone", // "headphone" or "stereo"
"language" to App.getSysLang(),
"notificationshowuptime" to 4000, // 4s

View File

@@ -24,9 +24,18 @@ private data class Frac(var nom: Int, val denom: Int) {
*
* Created by minjaesong on 2023-11-17.
*/
class AudioProcessBuf(inputSamplingRate: Int, val audioReadFun: (ByteArray) -> Int?, val onAudioFinished: () -> Unit) {
class AudioProcessBuf(val inputSamplingRate: Int, val audioReadFun: (ByteArray) -> Int?, val onAudioFinished: () -> Unit) {
private val doResample = inputSamplingRate != SAMPLING_RATE
var playbackSpeed = 1f
set(value) {
field = value.coerceIn(0.5f, 2f)
}
private val internalSamplingRate
get() = inputSamplingRate * playbackSpeed
private val doResample
get() = (internalSamplingRate - SAMPLING_RATE).absoluteValue >= 0.5f
companion object {
private val epsilon: Double = Epsilon.E
@@ -62,7 +71,7 @@ class AudioProcessBuf(inputSamplingRate: Int, val audioReadFun: (ByteArray) -> I
arrayOf(48000,44100,32768,32000,24000,22050,16384,16000,12000,11025,8192,8000).forEachIndexed { ri, r ->
arrayOf(128,256,512,1024,2048).forEachIndexed { bi, b ->
bufLut[b to r] = bl[bi * 12 + ri]
bufLut[b to r] = bl[bi * 12 + ri] * 2
}
}
}
@@ -70,7 +79,8 @@ class AudioProcessBuf(inputSamplingRate: Int, val audioReadFun: (ByteArray) -> I
private fun getOptimalBufferSize(rate: Int) = bufLut[BS to rate]!!
}
private val q = inputSamplingRate.toDouble() / SAMPLING_RATE // <= 1.0
private val q
get() = internalSamplingRate.toDouble() / SAMPLING_RATE // <= 1.0
private val fetchSize = (BS.toFloat() / MP3_CHUNK_SIZE).ceilToInt() * MP3_CHUNK_SIZE // fetchSize is always multiple of MP3_CHUNK_SIZE, even if the audio is NOT MP3
private val internalBufferSize = getOptimalBufferSize(inputSamplingRate)// fetchSize * 3

View File

@@ -75,11 +75,16 @@ class BinoPan(var pan: Float, var earDist: Float = EARDIST_DEFAULT): TerrarumAud
val timeDiffMax = earDist.coerceAtMost(EARDIST_MAX) / AudioMixer.SPEED_OF_SOUND * SAMPLING_RATEF
val angle = pan * HALF_PI
val delayInSamples = (timeDiffMax * FastMath.sin(angle)).absoluteValue
val delayInSamples = if (App.getConfigString("audio_speaker_setup") == "headphone")
(timeDiffMax * FastMath.sin(angle)).absoluteValue
else 0f
val volMultDbThis = PANNING_CONST * pan.absoluteValue
val volMultFsThis = decibelsToFullscale(volMultDbThis).toFloat()
val volMultFsOther = 1f / volMultFsThis
val volMultFsOther = if (App.getConfigString("audio_speaker_setup") == "headphone")
1f / volMultFsThis
else
(1f - pan.absoluteValue).coerceIn(0f, 1f)
if (pan >= 0) {
delays[L] = delayInSamples

View File

@@ -27,6 +27,8 @@ class UISoundControlPanel(remoCon: UIRemoCon?) : UICanvas() {
arrayOf("sfxvolume", { Lang["CREDITS_SFX"] }, "sliderd,0,1"),
arrayOf("", { "" }, "pp"),
arrayOf("guivolume", { Lang["MENU_LABEL_INTERFACE"] }, "sliderd,0,1"),
arrayOf("", { "" }, "pp"),
arrayOf("audio_speaker_setup", { Lang["MENU_OPTIONS_SPEAKER_SETUP"] }, "textsel,headphone=MENU_OPTIONS_SPEAKER_HEADPHONE,stereo=MENU_OPTIONS_SPEAKER_STEREO"),
arrayOf("", { Lang["MENU_LABEL_AUDIO_ENGINE"] }, "h1"),
arrayOf("audio_buffer_size", { Lang["MENU_OPTIONS_AUDIO_BUFFER_SIZE"] }, "spinnersel,128,256,512,1024,2048"),
arrayOf("", { "(${Lang["MENU_LABEL_RESTART_REQUIRED"]})" }, "p"),