This is an automated email from the git hooks/post-receive script.

git pushed a commit to branch main
in repository eradio.

View the commit online.

commit 9750f25ef32d2b6b2fe83317adfe990bbe0e532a
Author: politebot <[email protected]>
AuthorDate: Wed Oct 22 17:00:20 2025 -0500

    Dual audio during visualizer fix
---
 src/radio_player.c | 18 ++++++++++++------
 src/ui.c           | 15 ++++++++++++---
 src/visualizer.c   | 26 ++++++++++++++++++++++++++
 3 files changed, 50 insertions(+), 9 deletions(-)

diff --git a/src/radio_player.c b/src/radio_player.c
index 36a2d54..5845c5d 100644
--- a/src/radio_player.c
+++ b/src/radio_player.c
@@ -148,11 +148,14 @@ radio_player_play(AppData *ad, const char *url, const char *station_name)
           }
 
         emotion_object_file_set(ad->emotion, url);
-        emotion_object_play_set(ad->emotion, EINA_TRUE);
         ad->playing = EINA_TRUE;
 
-        // Start visualizer playback if active
-        visualizer_play(ad);
+        // If visualizer is active, let it handle playback
+        if (ad->visualizer_active) {
+            visualizer_play(ad);
+        } else {
+            emotion_object_play_set(ad->emotion, EINA_TRUE);
+        }
         if (ad->play_pause_item)
           elm_toolbar_item_icon_set(ad->play_pause_item, "media-playback-pause");
 
@@ -175,13 +178,16 @@ radio_player_play(AppData *ad, const char *url, const char *station_name)
 void
 radio_player_stop(AppData *ad)
 {
+   // Stop visualizer if active
+   if (ad->visualizer_active) {
+       visualizer_stop(ad);
+   }
+
+   // Stop main player
    emotion_object_play_set(ad->emotion, EINA_FALSE);
    emotion_object_position_set(ad->emotion, 0.0);
    ad->playing = EINA_FALSE;
 
-   // Stop visualizer if active
-   visualizer_stop(ad);
-
    // Cancel all timers
    if (stream_error_timer)
      {
diff --git a/src/ui.c b/src/ui.c
index 792b589..fd1b459 100644
--- a/src/ui.c
+++ b/src/ui.c
@@ -251,7 +251,7 @@ ui_create(AppData *ad)
 
    ad->play_pause_item = elm_toolbar_item_append(ad->controls_toolbar, "media-playback-start", "Play/Pause", _play_pause_btn_clicked_cb, ad);
    ad->stop_item = elm_toolbar_item_append(ad->controls_toolbar, "media-playback-stop", "Stop", _stop_btn_clicked_cb, ad);
-   ad->visualizer_item = elm_toolbar_item_append(ad->controls_toolbar, "media-video", "Visualizer", _visualizer_btn_clicked_cb, ad);
+   ad->visualizer_item = elm_toolbar_item_append(ad->controls_toolbar, "preferences-desktop-theme", "Visualizer", _visualizer_btn_clicked_cb, ad);
 
    evas_object_smart_callback_add(ad->search_btn, "clicked", _search_btn_clicked_cb, ad);
    evas_object_smart_callback_add(ad->search_entry, "activated", _search_entry_activated_cb, ad);
@@ -390,10 +390,19 @@ static void
 _volume_slider_changed_cb(void *data, Evas_Object *obj, void *event_info)
 {
    AppData *ad = data;
-   if (!ad || !ad->emotion) return;
+   if (!ad) return;
 
    double volume = elm_slider_value_get(obj);
-   emotion_object_audio_volume_set(ad->emotion, volume);
+
+   // Set volume for main emotion object if it exists
+   if (ad->emotion) {
+       emotion_object_audio_volume_set(ad->emotion, volume);
+   }
+
+   // Set volume for visualizer emotion object if it exists
+   if (ad->visualizer_emotion) {
+       emotion_object_audio_volume_set(ad->visualizer_emotion, volume);
+   }
 }
 
 void
diff --git a/src/visualizer.c b/src/visualizer.c
index c1cd736..9cb5224 100644
--- a/src/visualizer.c
+++ b/src/visualizer.c
@@ -54,6 +54,12 @@ visualizer_show(AppData *ad)
    // Set GOOM visualization
    emotion_object_vis_set(ad->visualizer_emotion, EMOTION_VIS_GOOM);
 
+   // Set initial volume to match the current volume slider setting
+   if (ad->volume_slider) {
+       double current_volume = elm_slider_value_get(ad->volume_slider);
+       emotion_object_audio_volume_set(ad->visualizer_emotion, current_volume);
+   }
+
    // Add title change callback for window title updates
    evas_object_smart_callback_add(ad->visualizer_emotion, "title_change", _visualizer_title_changed_cb, ad);
 
@@ -64,11 +70,15 @@ visualizer_show(AppData *ad)
    evas_object_show(ad->visualizer_emotion);
 
    // If there's already a station playing, connect the visualizer to it
+   // BUT pause the main player to prevent dual audio
    if (ad->playing && ad->emotion)
      {
         const char *current_url = emotion_object_file_get(ad->emotion);
         if (current_url)
           {
+             // Pause the main player to prevent dual audio
+             emotion_object_play_set(ad->emotion, EINA_FALSE);
+             // Connect visualizer to the same station
              emotion_object_file_set(ad->visualizer_emotion, current_url);
              emotion_object_play_set(ad->visualizer_emotion, EINA_TRUE);
           }
@@ -84,6 +94,7 @@ visualizer_hide(AppData *ad)
    if (!ad->visualizer_active)
      return;
 
+   // Stop the visualizer player and restore main player if needed
    if (ad->visualizer_emotion)
      {
         emotion_object_play_set(ad->visualizer_emotion, EINA_FALSE);
@@ -91,6 +102,12 @@ visualizer_hide(AppData *ad)
         ad->visualizer_emotion = NULL;
      }
 
+   // If we were playing before showing visualizer, restore main player
+   if (ad->playing && ad->emotion)
+     {
+        emotion_object_play_set(ad->emotion, EINA_TRUE);
+     }
+
    if (ad->visualizer_win)
      {
         evas_object_del(ad->visualizer_win);
@@ -124,6 +141,9 @@ visualizer_play(AppData *ad)
    if (!ad->visualizer_active || !ad->visualizer_emotion)
      return;
 
+   // Pause main player and start visualizer player
+   if (ad->emotion)
+     emotion_object_play_set(ad->emotion, EINA_FALSE);
    emotion_object_play_set(ad->visualizer_emotion, EINA_TRUE);
 }
 
@@ -134,6 +154,9 @@ visualizer_pause(AppData *ad)
      return;
 
    emotion_object_play_set(ad->visualizer_emotion, EINA_FALSE);
+   // Resume main player if it was playing
+   if (ad->playing && ad->emotion)
+     emotion_object_play_set(ad->emotion, EINA_TRUE);
 }
 
 void
@@ -144,6 +167,9 @@ visualizer_stop(AppData *ad)
 
    emotion_object_play_set(ad->visualizer_emotion, EINA_FALSE);
    emotion_object_position_set(ad->visualizer_emotion, 0.0);
+   // Only resume main player if we're not in a global stop operation
+   if (ad->playing && ad->emotion)
+     emotion_object_play_set(ad->emotion, EINA_TRUE);
 }
 
 void

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.

Reply via email to