Compare commits

..

4 Commits

Author SHA1 Message Date
duffyduck 70f806ef80 release: bump version to 0.0.9.1 2026-05-10 14:32:35 +02:00
duffyduck 0773d9496d fix(audio): AudioTrack auf USAGE_MEDIA — USAGE_ASSISTANT stallt auf OnePlus A12
Letzter Test zeigte: 163456B im Buffer mit play()-nach-Padding stallt
(pos=0), aber 170048B im Pre-Roll-Pfad startet einwandfrei. Differenz
nur 4% Daten — kein Buffer-Threshold-Problem, sondern AudioTrack-Quirk
mit USAGE_ASSISTANT bei "voller Buffer, dann play()".

USAGE_MEDIA ist robuster, AudioFocus laeuft eh separat ueber das
AudioFocusModule.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-10 14:31:23 +02:00
duffyduck 1a4857ed62 release: bump version to 0.0.9.0 2026-05-10 14:26:41 +02:00
duffyduck 962d814318 fix(audio): kurze TTS — Padding auf 3s erhoeht (OnePlus A12 Hard-Threshold)
Test mit 96000B (2s) Padding zeigte: AudioTrack stallt immer noch mit
pos=0/48000. Ab 8 Worten (~2.5s) geht's — der Hard-Threshold liegt also
zwischen 2s und 3s. Padding auf 3s, Buffer auf 4s.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-10 14:25:43 +02:00
3 changed files with 18 additions and 14 deletions
+2 -2
View File
@@ -79,8 +79,8 @@ android {
applicationId "com.ariacockpit"
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 809
versionName "0.0.8.9"
versionCode 901
versionName "0.0.9.1"
// Fallback fuer Libraries mit Product Flavors
missingDimensionStrategy 'react-native-camera', 'general'
}
@@ -79,13 +79,11 @@ class PcmStreamPlayerModule(reactContext: ReactApplicationContext) : ReactContex
val minBuf = AudioTrack.getMinBufferSize(sampleRate, channelConfig, encoding)
val bytesPerSecond = sampleRate * channels * 2 // 16-bit = 2 bytes
val prerollTarget = (bytesPerSecond * prerollSec).toInt()
// Buffer entkoppelt von Preroll — fester ~3s-Buffer reicht. Wenn er
// an Preroll gekoppelt ist (z.B. 7s bei preroll=3.5s) und nur kurz
// gefuettert wird, stallt AudioTrack auf manchen Geraeten (OnePlus
// Android 12: pos bleibt 0 obwohl play() lief).
// 3s damit Padding bis 2s vor play() noch Headroom hat (write() ist
// blocking — wenn Buffer voll ist, deadlockt es vor play()).
val bufferSize = (bytesPerSecond * 3).coerceAtLeast(minBuf * 8)
// Buffer entkoppelt von Preroll — fester ~4s-Buffer. OnePlus A12
// mit USAGE_ASSISTANT laeuft AudioTrack erst ab ~3s gepufferter
// Daten an. Wir padden Kurztexte vor play() auf 3s (siehe Block
// nach mainLoop), Buffer braucht ~1s Headroom weil write() blockt.
val bufferSize = (bytesPerSecond * 4).coerceAtLeast(minBuf * 8)
prerollBytes = prerollTarget
bytesBuffered = 0
playbackStarted = false
@@ -94,7 +92,12 @@ class PcmStreamPlayerModule(reactContext: ReactApplicationContext) : ReactContex
val newTrack = AudioTrack.Builder()
.setAudioAttributes(
AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_ASSISTANT)
// USAGE_MEDIA statt USAGE_ASSISTANT — auf OnePlus A12 stallt
// AudioTrack mit USAGE_ASSISTANT wenn play() nach komplettem
// Buffer-Fuellen called wird (pos bleibt 0). USAGE_MEDIA ist
// robust. AudioFocus wird eh separat ueber AudioFocusModule
// gehandhabt, nicht ueber dieses USAGE-Tag.
.setUsage(AudioAttributes.USAGE_MEDIA)
.setContentType(AudioAttributes.CONTENT_TYPE_SPEECH)
.build(),
)
@@ -229,10 +232,11 @@ class PcmStreamPlayerModule(reactContext: ReactApplicationContext) : ReactContex
bytesBuffered += silence.size
}
// Bei kurzem Text (play() noch nicht gestartet): Buffer auf min.
// 2s padden + DANN play(). Auf OnePlus A12 startet AudioTrack
// bei einem zu duennen Buffer nicht — pos bleibt auf 0 stehen.
// 3s padden + DANN play(). Auf OnePlus A12 startet AudioTrack
// bei < 3s Buffer-Inhalt nicht — pos bleibt auf 0 stehen.
// (2s war zu wenig, 8 Worte ~2.5s gingen, 3 Worte ~1s nicht.)
if (!playbackStarted && !writerShouldStop) {
val minStartBytes = bytesPerSecond * 2
val minStartBytes = bytesPerSecond * 3
if (bytesBuffered < minStartBytes) {
val padBytes = (minStartBytes - bytesBuffered.toInt()) and 0x7FFFFFFE
val pad = ByteArray(padBytes)
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "aria-cockpit",
"version": "0.0.8.9",
"version": "0.0.9.1",
"private": true,
"scripts": {
"android": "react-native run-android",