diff --git a/Fruit_Jam/Larsio_Paint_Music/sound_manager.py b/Fruit_Jam/Larsio_Paint_Music/sound_manager.py index 5520669d5..1702d5b29 100755 --- a/Fruit_Jam/Larsio_Paint_Music/sound_manager.py +++ b/Fruit_Jam/Larsio_Paint_Music/sound_manager.py @@ -9,6 +9,7 @@ import math import time import array +import json import gc import os import digitalio @@ -22,6 +23,7 @@ import audiomixer import synthio import board +import adafruit_pathlib as pathlib import adafruit_tlv320 from adafruit_midi.note_on import NoteOn from adafruit_midi.note_off import NoteOff @@ -63,6 +65,16 @@ def __init__(self, audio_output="pwm", seconds_per_eighth=0.25): # Setup PWM audio output on D10 self.audio = audiopwmio.PWMAudioOut(board.D10) else: # i2s + # optional configuration file for speaker/headphone setting + # check current directory first and then root directory + launcher_config = {} + if pathlib.Path("launcher.conf.json").exists(): + with open("launcher.conf.json", "r") as f: + launcher_config = json.load(f) + elif pathlib.Path("/launcher.conf.json").exists(): + with open("/launcher.conf.json", "r") as f: + launcher_config = json.load(f) + try: # Import libraries needed for I2S #check for Metro RP2350 vs. Fruit Jam @@ -96,20 +108,51 @@ def __init__(self, audio_output="pwm", seconds_per_eighth=0.25): wsel_pin = board.I2S_WS din_pin = board.I2S_DIN + # Check if DAC is connected + for i in range(500): # try for 5 seconds + if i2c.try_lock(): + break + time.sleep(0.01) + if 0x18 in i2c.scan(): + ltv320_present = True + else: + ltv320_present = False + i2c.unlock() + # Initialize TLV320 - self.tlv = adafruit_tlv320.TLV320DAC3100(i2c) - self.tlv.configure_clocks(sample_rate=11025, bit_depth=16) - self.tlv.headphone_output = True - self.tlv.headphone_volume = -15 # dB - - # Setup I2S audio output - important to do this AFTER configuring the DAC - self.audio = audiobusio.I2SOut( - bit_clock=bclck_pin, - word_select=wsel_pin, - data=din_pin - ) - - print("TLV320 I2S DAC initialized successfully") + if ltv320_present: + self.tlv = adafruit_tlv320.TLV320DAC3100(i2c) + + # set sample rate & bit depth + self.tlv.configure_clocks(sample_rate=11025, bit_depth=16) + + if "sound" in launcher_config: + if launcher_config["sound"] == "speaker": + # use speaker + self.tlv.speaker_output = True + self.tlv.speaker_volume = -60 + else: + # use headphones + self.tlv.headphone_output = True + self.tlv.headphone_volume = -15 # dB + else: + # default to headphones + self.tlv.headphone_output = True + self.tlv.headphone_volume = -15 # dB + + # Setup I2S audio output - important to do this AFTER configuring the DAC + self.audio = audiobusio.I2SOut( + bit_clock=bclck_pin, + word_select=wsel_pin, + data=din_pin + ) + + print("TLV320 I2S DAC initialized successfully") + + else: + print("TLV320 DAC not found, falling back to PWM audio output") + self.audio = audiopwmio.PWMAudioOut(board.D10) + except Exception as e: print(f"Error initializing TLV320 DAC: {e}") print("Falling back to PWM audio output") diff --git a/Metro/Metro_RP2350_Chips_Challenge/code.py b/Metro/Metro_RP2350_Chips_Challenge/code.py index e9b7d3f4f..8071dea90 100755 --- a/Metro/Metro_RP2350_Chips_Challenge/code.py +++ b/Metro/Metro_RP2350_Chips_Challenge/code.py @@ -7,7 +7,6 @@ import picodvi import framebufferio import displayio -import adafruit_tlv320 import audiobusio from audio import Audio from game import Game @@ -39,16 +38,12 @@ displayio.release_displays() -i2c = board.I2C() -dac = adafruit_tlv320.TLV320DAC3100(i2c) -dac.configure_clocks(sample_rate=44100, bit_depth=16) -dac.headphone_output = True -dac.headphone_volume = -15 # dB - if hasattr(board, "I2S_BCLK"): audio_bus = audiobusio.I2SOut(board.I2S_BCLK, board.I2S_WS, board.I2S_DIN) -else: +elif hasattr(board, "D9") and hasattr(board, "D10") and hasattr(board, "D11"): audio_bus = audiobusio.I2SOut(board.D9, board.D10, board.D11) +else: + audio_bus = None audio = Audio(audio_bus, SOUND_EFFECTS) fb = picodvi.Framebuffer(320, 240, clk_dp=board.CKP, clk_dn=board.CKN, diff --git a/Metro/Metro_RP2350_Chips_Challenge/definitions.py b/Metro/Metro_RP2350_Chips_Challenge/definitions.py index df53dc158..6194cf2ff 100755 --- a/Metro/Metro_RP2350_Chips_Challenge/definitions.py +++ b/Metro/Metro_RP2350_Chips_Challenge/definitions.py @@ -1,10 +1,63 @@ # SPDX-FileCopyrightText: 2025 Melissa LeBlanc-Williams # # SPDX-License-Identifier: MIT +import json +import time +import board from micropython import const +import adafruit_pathlib as pathlib +import adafruit_tlv320 + +# optional configuration file for speaker/headphone setting, check current and root directory +launcher_config = {} +if pathlib.Path("launcher.conf.json").exists(): + with open("launcher.conf.json", "r") as f: + launcher_config = json.load(f) +elif pathlib.Path("/launcher.conf.json").exists(): + with open("/launcher.conf.json", "r") as f: + launcher_config = json.load(f) + +# Check if DAC is connected +i2c = board.I2C() +for i in range(500): # try for 5 seconds + if i2c.try_lock(): + break + time.sleep(0.01) +if 0x18 in i2c.scan(): + ltv320_present = True +else: + ltv320_present = False +i2c.unlock() + +if ltv320_present: + dac = adafruit_tlv320.TLV320DAC3100(i2c) + + # set sample rate & bit depth + dac.configure_clocks(sample_rate=44100, bit_depth=16) + + if "sound" in launcher_config: + if launcher_config["sound"] == "speaker": + # use speaker + dac.speaker_output = True + dac.speaker_volume = -40 + elif launcher_config["sound"] != "mute": + # use headphones + dac.headphone_output = True + dac.headphone_volume = -15 # dB + else: + # default to headphones + dac.headphone_output = True + dac.headphone_volume = -15 # dB # Settings -PLAY_SOUNDS = True +if ltv320_present: + PLAY_SOUNDS = True +else: + PLAY_SOUNDS = False + +if "sound" in launcher_config: + if launcher_config["sound"] == "mute": + PLAY_SOUNDS = False # Timing Constants TICKS_PER_SECOND = const(20)