How to setup physical switches to control playback in MoodeAudio
Hello there. Its been a long time .
Recently i was trying out to build a DAC with Raspberry PI and IQAudio DAC. My choice of hardware is very cheap and it's a very small setup. Following is my Hardware
Raspberry PI 3 A+
IQAudio DAC+
For operating system I chose MoodeAudio over Volumio since its a open source alternative. And it had it's issues . But i don't want to pay for my OS. So I went for MoodeAudio.
Initial setup was very easy. Everything went so good i was able to play my song. The issue is there is no display. I tried to install a 3.5" touch display which is connected via GPIO. It was unsuccessfully. So i decided to have some physical switches to control playback. My controls were limited. Play/Pause, Next/previous, volume +/- and mute.
I tried with encoder for volume but its not working correctly. It adjusts volume but it's not working as expected. So i switch to physical press buttons. I bought some cheap momentary switches to test. I used a python script to listen GPIO. Here is the code i used
#!/usr/bin/python3 import lgpio import time import requests # MoodeAudio API URL MOODE_URL = "http://moode.local/command/?cmd=" # Replace <moode_ip> with your MoodeAudio IP address # Define pin numbers for buttons pins = { 4: "volume_up", 5: "volume_down", 6: "mute", 17: "next", 27: "previous", 22: "play_pause" # New pin for play/pause } # Example pins, adjust as needed h = lgpio.gpiochip_open(0) # Claim the pins and set pull-ups for pin in pins.keys(): lgpio.gpio_claim_input(h, pin, lgpio.SET_PULL_UP) # Current volume state current_volume = 50 # Default volume (set to your preferred starting point) def get_current_volume(): """Fetch current volume from MoodeAudio""" try: response = requests.get(f"{MOODE_URL}get_volume") if response.status_code == 200: data = response.json() volume = int(data.get("volume", 50)) # Default to 50 if missing print(f"Current volume from MoodeAudio: {volume}") return volume else: print("Failed to fetch volume") except Exception as e: print(f"Error fetching volume: {e}") return 50 # Fallback value def set_volume(volume): """Sets the volume via MoodeAudio API""" try: response = requests.get(f"{MOODE_URL}set_volume {volume}") if response.status_code == 200: print(f"Volume set to {volume}") else: print("Failed to set volume") except Exception as e: print(f"Error setting volume: {e}") def mute(): """Toggles mute via MoodeAudio API""" try: response = requests.get(f"{MOODE_URL}set_volume mute") if response.status_code == 200: print("Mute toggled") else: print("Failed to toggle mute") except Exception as e: print(f"Error toggling mute: {e}") def next_track(): """Go to the next track (for example, call the next API)""" try: response = requests.get(f"{MOODE_URL}next") if response.status_code == 200: print("Next track") else: print("Failed to go to next track") except Exception as e: print(f"Error skipping to next track: {e}") def previous_track(): """Go to the previous track (for example, call the previous API)""" try: response = requests.get(f"{MOODE_URL}previous") if response.status_code == 200: print("Previous track") else: print("Failed to go to previous track") except Exception as e: print(f"Error skipping to previous track: {e}") def play_pause(): """Toggle play/pause via MoodeAudio API""" try: response = requests.get(f"{MOODE_URL}pause") if response.status_code == 200: print("Toggled play/pause") else: print("Failed to toggle play/pause") except Exception as e: print(f"Error toggling play/pause: {e}") try: while True: for pin, action in pins.items(): state = lgpio.gpio_read(h, pin) if state == 0: # Button is pressed (active low) if action == "volume_up": current_volume = min(current_volume + 5, 100) # Increase volume, max 100 set_volume(current_volume) elif action == "volume_down": current_volume = max(current_volume - 5, 0) # Decrease volume, min 0 set_volume(current_volume) elif action == "mute": mute() # Toggle mute elif action == "next": next_track() # Next track elif action == "previous": previous_track() # Previous track elif action == "play_pause": play_pause() # Toggle play/pause time.sleep(0.5) # Debounce time for button press time.sleep(0.2) except KeyboardInterrupt: lgpio.gpiochip_close(h)
sudo nano /etc/rc.local
exit 0
line:/usr/bin/python3 /usr/local/bin/switch.py &
sudo chmod +x /usr/local/bin/switch.pyLets restart the system.
Comments
<a href="https://digitalfloats.com/graphic-design-course-in-
hyderabad/">new How to setup physical switches to control playback in MoodeAudio;/a>
https://digitalfloats.com/graphic-design-course-in-hyderabad/