diff --git a/auracast/auracast_config.py b/auracast/auracast_config.py index f9b70f5..09cb5e1 100644 --- a/auracast/auracast_config.py +++ b/auracast/auracast_config.py @@ -3,16 +3,34 @@ from bumble.profiles import bap from dataclasses import dataclass # Define some base dataclasses to hold the relevant parameters +@dataclass +class AuracastQoSConfig: + iso_interval_us: int = 10000 + number_of_retransmissions:int = 4 + max_transport_latency_ms:int = 43 # TODO: 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_interval_us = 10000, + number_of_retransmissions = 3, + max_transport_latency_ms = 65 +) +qos_config_mono_low_rel = AuracastQoSConfig( #highest latency + iso_interval_us = 10000, + number_of_retransmissions = 2, + max_transport_latency_ms = 65 +) + @dataclass class AuracastGlobalConfig: + qos_config: AuracastQoSConfig device_name: str = 'Auracaster' transport: str = '' auracast_device_address: hci.Address = hci.Address('F0:F1:F2:F3:F4:F5') auracast_sampling_rate_hz: int = 24000 octets_per_frame: int = 60 #48kbps@24kHz # bitrate = octets_per_frame * 8 / frame len frame_duration_us: int = 10000 - presentation_delay_us: int = 40000 - + presentation_delay_us: int = 40000 @dataclass class AuracastBigConfig: @@ -24,7 +42,7 @@ class AuracastBigConfig: broadcast_program_info: str = 'Some Announcements' broacast_wav_file_path: str = './auracast/announcement_48_10_96000_en.wav' -global_base_config = AuracastGlobalConfig() +global_base_config = AuracastGlobalConfig(qos_config=AuracastQoSConfig()) # Instanciate some example configurations broadcast_de = AuracastBigConfig( diff --git a/auracast/multicast.py b/auracast/multicast.py index 9d9ab7c..5310978 100644 --- a/auracast/multicast.py +++ b/auracast/multicast.py @@ -16,7 +16,7 @@ # Imports # ----------------------------------------------------------------------------- from __future__ import annotations - +import pprint import asyncio import contextlib import logging @@ -43,7 +43,7 @@ from bumble.profiles import bass import bumble.device import bumble.transport import bumble.utils -from bumble.device import Host +from bumble.device import Host, BIGInfoAdvertisement import auracast_config @@ -184,7 +184,7 @@ async def run_broadcast( ) ], ) - logging.info('Setup Advertising') + logger.info('Setup Advertising') bigs[f'big{i}']['broadcast_audio_announcement'] = bap.BroadcastAudioAnnouncement(conf.broadcast_id) advertising_set = await device.create_advertising_set( random_address=conf.broadcast_random_address, @@ -224,10 +224,10 @@ async def run_broadcast( bigs[f'big{i}']['advertising_set'] , parameters=bumble.device.BigParameters( num_bis=1, - sdu_interval=global_config.frame_duration_us, + sdu_interval=global_config.qos_config.iso_interval_us, max_sdu=global_config.octets_per_frame, # is this octets per frame ? - max_transport_latency=65, - rtn=4, + max_transport_latency=global_config.qos_config.max_transport_latency_ms, + rtn=global_config.qos_config.number_of_retransmissions, broadcast_code=( bytes.fromhex(conf.broadcast_code) if conf.broadcast_code else None ), @@ -243,6 +243,10 @@ async def run_broadcast( bigs[f'big{i}']['frames_iterator'] = itertools.cycle(frames) + logging.debug(f'big{i} parameters are:') + logging.debug('%s', pprint.pformat(vars(big))) + logging.debug(f'Finished setup of big{i}.') + await asyncio.sleep(3) # Wait for advertising to set up LOOP_FINITE_PKGS = -1 # set -1 to loop infinitely @@ -293,7 +297,10 @@ def broadcast(global_conf: auracast_config.AuracastGlobalConfig, big_conf: List[ # ----------------------------------------------------------------------------- if __name__ == "__main__": - logging.basicConfig(level=logging.INFO) + logging.basicConfig( + level=logging.INFO, + format='%(module)s.py:%(lineno)d %(levelname)s: %(message)s' +) global_conf = auracast_config.global_base_config @@ -301,8 +308,11 @@ if __name__ == "__main__": #global_conf.transport='serial:/dev/serial/by-id/usb-SEGGER_J-Link_001050076061-if02,1000000,rtscts' # transport for nrf53dk - global_conf.transport='serial:/dev/serial/by-id/usb-SEGGER_J-Link_001057705357-if02,1000000,rtscts' # transport for nrf54l15dk + #global_conf.transport='serial:/dev/serial/by-id/usb-SEGGER_J-Link_001057705357-if02,1000000,rtscts' # transport for nrf54l15dk + global_conf.transport='serial:/dev/ttyACM1,115200,rtscts' + + global_conf.qos_config = auracast_config.qos_config_mono_high_rel # TODO: low rel, actually advertising seems to work again- maybe then the problem is hci->controler bigs = [ auracast_config.broadcast_de, @@ -315,7 +325,12 @@ if __name__ == "__main__": global_conf.octets_per_frame = 40 # 32kbps@16kHz # Note: 24kHz is only working with 2 streams - so this may be a host->controller interface bottleneck - # TODO: use thread usage debugger on controller to check actual cpu load + # use thread usage debugger on controller to check actual cpu load - not much load + + # TODO; I dont think hci is really the bottleneck. probably limited airtime is the problem. Analyze this somehow. + # Advertising is still 1Mbit phy - use 2Mbit + # Check is the sdu interval (iso interval?) may really be varied - does not seem to work really + # # sdu per frame also needs to be adjusted somehow? is this even compatible with lc3? broadcast( global_conf,