FS#13836 - Remove the pcm sink_mutex to unbreak usb_dac mode

rockbox-gerrit-noreply--- via rockbox-cvs <[email protected]>
Newsgroups gmane.comp.systems.archos.rockbox.cvs
Message-ID <[email protected]>
commit e923b354a6dc073f221156eb8bbca0a13666490e
Author: Solomon Peachy <[email protected]>
Date:   Sat Mar 21 07:59:11 2026 -0400

    FS#13836 - Remove the pcm sink_mutex to unbreak usb_dac mode
    
    The purpose of the mutex is to make it possible to switch pcm sinks
    safely, but pcm_play_lock/unlock and pcm_set_frequency need to be
    called from IRQ context which is fundamentally incompatible with
    our mutex implementation.
    
    The proper path forward will be to promote the counter-based per-sink
    lock/unlock implementation to the pcm core, and only allowing sink
    switching when the counter is 0.
    
    In the mean time, just remove sink_mutex entirely as the sink switching
    code has yet to be committed.
    
    Change-Id: I029459d7ec6ea47c6e2b8fce52d203129a282832

diff --git a/firmware/pcm.c b/firmware/pcm.c
index 0cee855fcc..08383ace2d 100644
--- a/firmware/pcm.c
+++ b/firmware/pcm.c
@@ -83,7 +83,6 @@ static struct pcm_sink* sinks[1] = {
     [PCM_SINK_BUILTIN] = &builtin_pcm_sink,
 };
 static enum pcm_sink_ids cur_sink = PCM_SINK_BUILTIN;
-static struct mutex sink_mutex; /* protects sinks and cur_sink */
 
 /* The registered callback function to ask for more mp3 data */
 volatile pcm_play_callback_type
@@ -238,14 +237,11 @@ bool pcm_is_playing(void)
  */
 
 void pcm_play_lock(void) {
-    mutex_lock(&sink_mutex);
     sinks[cur_sink]->ops.lock();
-    /* hold sink_mutex until pcm_play_unlock() */
 }
 
 void pcm_play_unlock(void) {
     sinks[cur_sink]->ops.unlock();
-    mutex_unlock(&sink_mutex);
 }
 
 /* This should only be called at startup before any audio playback or
@@ -254,7 +250,6 @@ void pcm_init(void)
 {
     logf("pcm_init");
 
-    mutex_init(&sink_mutex);
     for(size_t i = 0; i < ARRAYLEN(sinks); i += 1) {
         sinks[i]->pending_freq = sinks[i]->caps.default_freq;
         sinks[i]->configured_freq = -1UL;
@@ -359,7 +354,6 @@ void pcm_set_frequency(unsigned int samplerate)
     samplerate = pcm_sampr_to_hw_sampr(samplerate, type);
 #endif /* CONFIG_SAMPR_TYPES */
 
-    mutex_lock(&sink_mutex);
     struct pcm_sink* sink = sinks[cur_sink];
     index = round_value_to_list32(samplerate, sink->caps.samprs, sink->caps.num_samprs, false);
 
@@ -367,7 +361,6 @@ void pcm_set_frequency(unsigned int samplerate)
         index = sink->caps.default_freq; /* Invalid = default */
 
     sink->pending_freq = index;
-    mutex_unlock(&sink_mutex);
 }
 
 /* return last-set frequency */
@@ -384,14 +377,12 @@ void pcm_apply_settings(void)
 
     pcm_wait_for_init();
 
-    mutex_lock(&sink_mutex);
     struct pcm_sink* sink = sinks[cur_sink];
     if(sink->pending_freq != sink->configured_freq) {
         logf(" sink->set_freq");
         sink->ops.set_freq(sink->pending_freq);
         sink->configured_freq = sink->pending_freq;
     }
-    mutex_unlock(&sink_mutex);
 }
 
 #ifdef HAVE_RECORDING
-- 
rockbox-cvs mailing list
[email protected]
https://lists.haxx.se/mailman/listinfo/rockbox-cvs
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.