Update Kha/Kinc/Backends/System/Linux/Sources/kinc/backend/sound.c.h

This commit is contained in:
LeenkxTeam 2025-04-03 06:41:21 +00:00
parent f9d463ca1d
commit 30748390ca

View File

@ -34,22 +34,46 @@ void copySample(void *buffer) {
}
int playback_callback(snd_pcm_sframes_t nframes) {
int err = 0;
if (kinc_a2_internal_callback(&a2_buffer, nframes)) {
int ni = 0;
while (ni < nframes) {
int i = 0;
for (; ni < nframes && i < 4096 * 2; ++i, ++ni) {
copySample(&buf[i * 2]);
}
int err2;
if ((err2 = snd_pcm_writei(playback_handle, buf, i)) < 0) {
fprintf(stderr, "write failed (%s)\n", snd_strerror(err2));
}
err += err2;
}
}
return err;
int err = 0;
if (kinc_a2_internal_callback(&a2_buffer, nframes)) {
int ni = 0;
while (ni < nframes) {
int i = 0;
for (; ni < nframes && i < 4096; ++i, ++ni) {
copySample(&buf[i * 2]);
}
int err2 = snd_pcm_writei(playback_handle, buf, i);
if (err2 < 0) {
fprintf(stderr, "ALSA write failed in playback_callback: %s\n", snd_strerror(err2));
return err2;
}
if (err2 < i) {
fprintf(stderr, "ALSA short write in playback_callback: wrote %d of %d frames\n", err2, i);
}
}
err = nframes;
}
else {
// Write silence data to prevent recovery
if (nframes > 4096) {
fprintf(stderr, "Warning: ALSA requested %ld frames for silence, exceeding local buffer size %d. Clamping.\n", nframes, 4096);
nframes = 4096;
}
memset(buf, 0, nframes * 4);
int err2 = snd_pcm_writei(playback_handle, buf, nframes);
if (err2 < 0) {
fprintf(stderr, "ALSA silence write failed in playback_callback: %s\n", snd_strerror(err2));
err = err2;
} else {
if (err2 < nframes) {
fprintf(stderr, "ALSA short silence write in playback_callback: wrote %d of %d frames\n", err2, (int)nframes);
}
err = err2;
}
}
return err;
}
bool tryToRecover(snd_pcm_t *handle, int errorCode) {