refractoring/auracast_config (#3)

- use pydantic for configuration management

Reviewed-on: https://gitea.pstruebi.xyz/auracaster/bumble-auracast/pulls/3
This commit was merged in pull request #3.
This commit is contained in:
2025-03-05 18:00:26 +01:00
parent b8b4c82be0
commit 419a65ba09
6 changed files with 89 additions and 96 deletions

View File

@@ -1,40 +1,39 @@
from bumble import hci
from bumble.profiles import bap
from dataclasses import dataclass
from pydantic import BaseModel
# Define some base dataclasses to hold the relevant parameters
@dataclass
class AuracastQoSConfig:
# Define some base to hold the relevant parameters
class AuracastQoSConfig(BaseModel):
iso_int_multiple_10ms: int
number_of_retransmissions: int
max_transport_latency_ms: int
class AuracastQosHigh(AuracastQoSConfig):
iso_int_multiple_10ms: int = 1
number_of_retransmissions:int = 4 #4
max_transport_latency_ms:int = 43 #varies from the default value in bumble (was 65)
qos_config_mono_high_rel = AuracastQoSConfig() #highest rel + lowest latency
qos_config_mono_medium_rel = AuracastQoSConfig(
iso_int_multiple_10ms = 2,
number_of_retransmissions = 3,
max_transport_latency_ms = 65
)
qos_config_mono_low_rel = AuracastQoSConfig( #highest latency
iso_int_multiple_10ms = 3,
number_of_retransmissions = 2,
max_transport_latency_ms = 65
)
class AuracastQosMid(AuracastQoSConfig):
iso_int_multiple_10ms: int = 2
number_of_retransmissions:int = 3
max_transport_latency_ms:int = 65
@dataclass
class AuracastGlobalConfig:
qos_config: AuracastQoSConfig
class AuracastQosLow(AuracastQoSConfig):
iso_int_multiple_10ms: int = 3
number_of_retransmissions:int = 2 #4
max_transport_latency_ms:int = 65 #varies from the default value in bumble (was 65)
class AuracastGlobalConfig(BaseModel):
qos_config: AuracastQoSConfig = AuracastQosHigh()
debug: bool = False
device_name: str = 'Auracaster'
transport: str = ''
auracast_device_address: hci.Address = hci.Address('F0:F1:F2:F3:F4:F5')
auracast_device_address: str = 'F0:F1:F2:F3:F4:F5'
auracast_sampling_rate_hz: int = 16000
octets_per_frame: int = 40 #48kbps@24kHz # bitrate = octets_per_frame * 8 / frame len
frame_duration_us: int = 10000
presentation_delay_us: int = 40000
manufacturer_data: tuple[int, bytes] = None
manufacturer_data: tuple[int, bytes] |None = None # TODO:pydantic does not support bytes serialization
global_base_config = AuracastGlobalConfig(qos_config=AuracastQoSConfig())
# "Audio input. "
# "'device' -> use the host's default sound input device, "
@@ -42,13 +41,10 @@ global_base_config = AuracastGlobalConfig(qos_config=AuracastQoSConfig())
# "(specify 'device:?' to get a list of available sound input devices), "
# "'stdin' -> receive audio from stdin as int16 PCM, "
# "'file:<filename> -> read audio from a .wav or raw int16 PCM file. "
@dataclass
class AuracastBigConfig:
id: int = 123456,
random_address: hci.Address = hci.Address('F1:F1:F2:F3:F4:F5')
code: str = None # Broadcast_Code a 16-octet parameter provided by the Host
class AuracastBigConfig(BaseModel):
id: int = 123456
random_address: str = 'F1:F1:F2:F3:F4:F5'
code: str | None = None # Broadcast_Code a 16-octet parameter provided by the Host
language: str = 'eng' # See: https://en.wikipedia.org/wiki/List_of_ISO_639_language_codes
name: str = 'Broadcast0'
program_info: str = 'Some Announcements'
@@ -58,49 +54,45 @@ class AuracastBigConfig:
precode_wav: bool = False
iso_que_len: int = 64
class AuracastBigConfigDe(AuracastBigConfig):
id: int = 12
random_address: str = 'F1:F1:F2:F3:F4:F5'
name: str = 'Broadcast0'
language: str ='deu'
program_info: str = 'Announcements German'
audio_source: str = 'file:./testdata/announcement_de.wav'
# Instanciate some example configurations
broadcast_de = AuracastBigConfig(
id=12,
random_address=hci.Address('F1:F1:F2:F3:F4:F5'),
name = 'Broadcast0',
language='deu',
program_info = 'Announcements German',
audio_source = 'file:./testdata/announcement_de.wav',
)
class AuracastBigConfigEn(AuracastBigConfig):
id: int = 123
random_address: str = 'F2:F1:F2:F3:F4:F5'
name: str = 'Broadcast1'
language: str ='eng'
program_info: str = 'Announcements English'
audio_source: str = 'file:./testdata/announcement_en.wav'
broadcast_en = AuracastBigConfig(
id=123,
random_address=hci.Address('F2:F1:F2:F3:F4:F5'),
name = 'Broadcast1',
language='eng',
program_info = 'Announcements English',
audio_source = 'file:./testdata/announcement_en.wav',
)
class AuracastBigConfigFr(AuracastBigConfig):
id: int = 1234
random_address: str = 'F3:F1:F2:F3:F4:F5'
name: str = 'Broadcast2'
language: str ='fra'
program_info: str = 'Announcements French'
audio_source: str = 'file:./testdata/announcement_fr.wav'
broadcast_fr = AuracastBigConfig(
id=1234,
random_address=hci.Address('F3:F1:F2:F3:F4:F5'),
name = 'Broadcast2',
language='fra',
program_info = 'Announcements French',
audio_source = 'file:./testdata/announcement_fr.wav',
)
class AuracastBigConfigEs(AuracastBigConfig):
id: int =12345
random_address: str = 'F4:F1:F2:F3:F4:F5'
name: str = 'Broadcast3'
language: str ='spa'
program_info: str = 'Announcements Spanish'
audio_source: str = 'file:./testdata/announcement_es.wav'
broadcast_es = AuracastBigConfig(
id=12345,
random_address=hci.Address('F4:F1:F2:F3:F4:F5'),
name = 'Broadcast3',
language='spa',
program_info = 'Announcements Spanish',
audio_source = 'file:./testdata/announcement_es.wav',
)
class AuracastBigConfigIt(AuracastBigConfig):
id: int =1234567
random_address: str = 'F5:F1:F2:F3:F4:F5'
name: str = 'Broadcast4'
language: str ='ita'
program_info: str = 'Announcements Italian'
audio_source: str = 'file:./testdata/announcement_it.wav'
broadcast_it = AuracastBigConfig(
id=123456,
random_address=hci.Address('F5:F1:F2:F3:F4:F5'),
name = 'Broadcast4',
language='ita',
program_info = 'Announcements Italian',
audio_source = 'file:./testdata/announcement_it.wav',
)
# TODO: could be best to merge all in just one CONFIG class and give every language an enable parameter