summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCássio Gabriel <cassiogabrielcontato@gmail.com>2026-04-27 19:13:28 -0300
committerTakashi Iwai <tiwai@suse.de>2026-04-29 07:52:54 +0200
commit6e934725ec3abb63247a0cb4cd455fff3c009ef5 (patch)
tree0a695e827ae1e4516af3a53b430c1ea86cc90cff
parented060707d4bac8f1a2fcf83af4e1f01d3337893c (diff)
sound: oss: dmasound: kick queued output before extending tail fragment
sq_write() currently clears POST and then immediately appends to the current rear fragment. If the queue already contains complete fragments ahead of that incomplete tail, playback is not kicked until the queue-full wait path or the final sq_play() at the end of the write. That wastes the slack those queued samples would otherwise provide while the driver spends more time copying and translating more data into the tail fragment. All in-tree dmasound playback backends still refuse to queue an incomplete last fragment while !syncing, but they can start earlier complete fragments. Call sq_play() immediately after clearing POST and before extending the rear fragment so already-queued complete output can start earlier. Signed-off-by: Cássio Gabriel <cassiogabrielcontato@gmail.com> Link: https://patch.msgid.link/20260427-dmasound-sq-play-v1-1-28bbeb8509b1@gmail.com Signed-off-by: Takashi Iwai <tiwai@suse.de>
-rw-r--r--sound/oss/dmasound/dmasound_core.c10
1 files changed, 5 insertions, 5 deletions
diff --git a/sound/oss/dmasound/dmasound_core.c b/sound/oss/dmasound/dmasound_core.c
index a718b75bb6a0..e80f730d0803 100644
--- a/sound/oss/dmasound/dmasound_core.c
+++ b/sound/oss/dmasound/dmasound_core.c
@@ -574,11 +574,6 @@ static ssize_t sq_write(struct file *file, const char __user *src, size_t uLeft,
uWritten = 0 ;
}
-/* FIXME: I think that this may be the wrong behaviour when we get strapped
- for time and the cpu is close to being (or actually) behind in sending data.
- - because we've lost the time that the N samples, already in the buffer,
- would have given us to get here with the next lot from the user.
-*/
/* The interrupt doesn't start to play the last, incomplete frame.
* Thus we can append to it without disabling the interrupts! (Note
* also that write_sq.rear isn't affected by the interrupt.)
@@ -598,6 +593,11 @@ static ssize_t sq_write(struct file *file, const char __user *src, size_t uLeft,
write_sq.syncing &= ~2 ; /* take out POST status */
spin_unlock_irqrestore(&dmasound.lock, flags);
+ /* Start any already-complete fragments before we spend
+ * more time extending the incomplete tail fragment.
+ */
+ sq_play();
+
if (write_sq.count > 0 &&
(bLeft = write_sq.block_size-write_sq.rear_size) > 0) {
dest = write_sq.buffers[write_sq.rear];