make multicast with 2 broadcasters work
This commit is contained in:
@@ -270,6 +270,9 @@ if __name__ == "__main__":
|
|||||||
]
|
]
|
||||||
global_conf.octets_per_frame=60# 48kbps@24kHz
|
global_conf.octets_per_frame=60# 48kbps@24kHz
|
||||||
|
|
||||||
|
global_conf.auracast_sampling_rate_hz = 32000
|
||||||
|
global_conf.octets_per_frame=80# 64kbps@24kHz
|
||||||
|
|
||||||
broadcast(
|
broadcast(
|
||||||
global_conf,
|
global_conf,
|
||||||
bigs
|
bigs
|
||||||
|
|||||||
@@ -9,16 +9,17 @@ class AuracastGlobalConfig:
|
|||||||
transport: str = ''
|
transport: str = ''
|
||||||
auracast_device_address: hci.Address = hci.Address('F0:F1:F2:F3:F4:F5')
|
auracast_device_address: hci.Address = hci.Address('F0:F1:F2:F3:F4:F5')
|
||||||
auracast_sampling_rate_hz: int = 24000
|
auracast_sampling_rate_hz: int = 24000
|
||||||
octets_per_frame: int = 100 # bitrate = octets_per_frame * 8 / frame len
|
octets_per_frame: int = 60 #48kbps@24kHz # bitrate = octets_per_frame * 8 / frame len
|
||||||
frame_duration_us: int = 10000
|
frame_duration_us: int = 10000
|
||||||
presentation_delay_us: int = 40000
|
presentation_delay_us: int = 40000
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class AuracastBigConfig:
|
class AuracastBigConfig:
|
||||||
broadcast_id: int =123456
|
broadcast_id: int =123456,
|
||||||
|
broadcast_random_address: hci.Address = hci.Address('F1:F1:F2:F3:F4:F5')
|
||||||
broadcast_code: str = None # a hexstr
|
broadcast_code: str = None # a hexstr
|
||||||
broadcast_language: str = 'en'
|
broadcast_language: str = 'en' # See: https://en.wikipedia.org/wiki/ISO_639-3
|
||||||
broadcast_name: str = 'Broadcast0'
|
broadcast_name: str = 'Broadcast0'
|
||||||
broadcast_program_info: str = 'Some Announcements'
|
broadcast_program_info: str = 'Some Announcements'
|
||||||
broacast_wav_file_path: str = './auracast/announcement_48_10_96000_en.wav'
|
broacast_wav_file_path: str = './auracast/announcement_48_10_96000_en.wav'
|
||||||
@@ -28,21 +29,27 @@ global_base_config = AuracastGlobalConfig()
|
|||||||
# Instanciate some example configurations
|
# Instanciate some example configurations
|
||||||
broadcast_de = AuracastBigConfig(
|
broadcast_de = AuracastBigConfig(
|
||||||
broadcast_id=12,
|
broadcast_id=12,
|
||||||
broadcast_language='de',
|
broadcast_random_address=hci.Address('F1:F1:F2:F3:F4:F5'),
|
||||||
broadcast_name = 'Broadcast0',
|
broadcast_name = 'Broadcast0',
|
||||||
|
broadcast_language='deu',
|
||||||
|
broadcast_program_info = 'Announcements German',
|
||||||
broacast_wav_file_path = './auracast/announcement_48_10_96000_de.wav',
|
broacast_wav_file_path = './auracast/announcement_48_10_96000_de.wav',
|
||||||
)
|
)
|
||||||
|
|
||||||
broadcast_en = AuracastBigConfig(
|
broadcast_en = AuracastBigConfig(
|
||||||
broadcast_id=123,
|
broadcast_id=123,
|
||||||
broadcast_language='eng',
|
broadcast_random_address=hci.Address('F2:F1:F2:F3:F4:F5'),
|
||||||
broadcast_name = 'Broadcast1',
|
broadcast_name = 'Broadcast1',
|
||||||
|
broadcast_language='eng',
|
||||||
|
broadcast_program_info = 'Announcements English',
|
||||||
broacast_wav_file_path = './auracast/announcement_48_10_96000_en.wav',
|
broacast_wav_file_path = './auracast/announcement_48_10_96000_en.wav',
|
||||||
)
|
)
|
||||||
|
|
||||||
broadcast_fr = AuracastBigConfig(
|
broadcast_fr = AuracastBigConfig(
|
||||||
broadcast_id=1234,
|
broadcast_id=1234,
|
||||||
broadcast_language='fr',
|
broadcast_random_address=hci.Address('F3:F1:F2:F3:F4:F5'),
|
||||||
broadcast_name = 'Broadcast2',
|
broadcast_name = 'Broadcast2',
|
||||||
|
broadcast_language='fra',
|
||||||
|
broadcast_program_info = 'Announcements French',
|
||||||
broacast_wav_file_path = './auracast/announcement_48_10_96000_fr.wav',
|
broacast_wav_file_path = './auracast/announcement_48_10_96000_fr.wav',
|
||||||
)
|
)
|
||||||
@@ -84,7 +84,7 @@ async def create_device(config: auracast_config.AuracastGlobalConfig) -> AsyncGe
|
|||||||
name=config.device_name,
|
name=config.device_name,
|
||||||
address=config.auracast_device_address,
|
address=config.auracast_device_address,
|
||||||
keystore='JsonKeyStore',
|
keystore='JsonKeyStore',
|
||||||
le_simultaneous_enabled=True #TODO: needed ?
|
#le_simultaneous_enabled=True #TODO: needed ?
|
||||||
)
|
)
|
||||||
|
|
||||||
device = bumble.device.Device.from_config_with_hci(
|
device = bumble.device.Device.from_config_with_hci(
|
||||||
@@ -113,7 +113,6 @@ def run_async(async_command: Coroutine) -> None:
|
|||||||
)
|
)
|
||||||
|
|
||||||
PKGS_COUNT = 0
|
PKGS_COUNT = 0
|
||||||
ADVERTISING_INTERVAL_SLOWDOWN_FACTOR = 2
|
|
||||||
|
|
||||||
async def run_broadcast(
|
async def run_broadcast(
|
||||||
global_config : auracast_config.AuracastGlobalConfig,
|
global_config : auracast_config.AuracastGlobalConfig,
|
||||||
@@ -168,6 +167,9 @@ async def run_broadcast(
|
|||||||
le_audio.Metadata.Entry(
|
le_audio.Metadata.Entry(
|
||||||
tag=le_audio.Metadata.Tag.PROGRAM_INFO, data=conf.broadcast_program_info.encode()
|
tag=le_audio.Metadata.Tag.PROGRAM_INFO, data=conf.broadcast_program_info.encode()
|
||||||
),
|
),
|
||||||
|
le_audio.Metadata.Entry(
|
||||||
|
tag=le_audio.Metadata.Tag.BROADCAST_NAME, data=conf.broadcast_name.encode()
|
||||||
|
),
|
||||||
]
|
]
|
||||||
),
|
),
|
||||||
bis=[
|
bis=[
|
||||||
@@ -184,12 +186,13 @@ async def run_broadcast(
|
|||||||
logging.info('Setup Advertising')
|
logging.info('Setup Advertising')
|
||||||
bigs[f'big{i}']['broadcast_audio_announcement'] = bap.BroadcastAudioAnnouncement(conf.broadcast_id)
|
bigs[f'big{i}']['broadcast_audio_announcement'] = bap.BroadcastAudioAnnouncement(conf.broadcast_id)
|
||||||
advertising_set = await device.create_advertising_set(
|
advertising_set = await device.create_advertising_set(
|
||||||
|
random_address=conf.broadcast_random_address,
|
||||||
advertising_parameters=bumble.device.AdvertisingParameters(
|
advertising_parameters=bumble.device.AdvertisingParameters(
|
||||||
advertising_event_properties=bumble.device.AdvertisingEventProperties(
|
advertising_event_properties=bumble.device.AdvertisingEventProperties(
|
||||||
is_connectable=False
|
is_connectable=False
|
||||||
),
|
),
|
||||||
primary_advertising_interval_min=100*ADVERTISING_INTERVAL_SLOWDOWN_FACTOR,
|
primary_advertising_interval_min=100,
|
||||||
primary_advertising_interval_max=200*ADVERTISING_INTERVAL_SLOWDOWN_FACTOR,
|
primary_advertising_interval_max=200,
|
||||||
advertising_sid=i
|
advertising_sid=i
|
||||||
# TODO: use 2mbit phy
|
# TODO: use 2mbit phy
|
||||||
),
|
),
|
||||||
@@ -202,8 +205,8 @@ async def run_broadcast(
|
|||||||
)
|
)
|
||||||
),
|
),
|
||||||
periodic_advertising_parameters=bumble.device.PeriodicAdvertisingParameters(
|
periodic_advertising_parameters=bumble.device.PeriodicAdvertisingParameters(
|
||||||
periodic_advertising_interval_min=80*ADVERTISING_INTERVAL_SLOWDOWN_FACTOR,
|
periodic_advertising_interval_min=80,
|
||||||
periodic_advertising_interval_max=160*ADVERTISING_INTERVAL_SLOWDOWN_FACTOR,
|
periodic_advertising_interval_max=160,
|
||||||
),
|
),
|
||||||
periodic_advertising_data=bigs[f'big{i}']['basic_audio_announcement'].get_advertising_data(),
|
periodic_advertising_data=bigs[f'big{i}']['basic_audio_announcement'].get_advertising_data(),
|
||||||
auto_restart=True,
|
auto_restart=True,
|
||||||
@@ -243,20 +246,22 @@ async def run_broadcast(
|
|||||||
logging.info("Broadcasting...")
|
logging.info("Broadcasting...")
|
||||||
def on_packet_complete(event):
|
def on_packet_complete(event):
|
||||||
global PKGS_COUNT
|
global PKGS_COUNT
|
||||||
#for val in bigs.values(): # loop over bigs
|
|
||||||
#frame = next(val['frames_iterator'] )
|
|
||||||
#val['big'].bis_links[0].write(frame)
|
|
||||||
#global pkgs_count
|
|
||||||
PKGS_COUNT = PKGS_COUNT + 1
|
PKGS_COUNT = PKGS_COUNT + 1
|
||||||
|
|
||||||
|
event_handle = event.connection_handles[0]
|
||||||
|
|
||||||
if PKGS_COUNT < LOOP_FINITE_PKGS or LOOP_FINITE_PKGS == -1 :
|
if PKGS_COUNT < LOOP_FINITE_PKGS or LOOP_FINITE_PKGS == -1 :
|
||||||
frame = next(bigs[f'big0']['frames_iterator'] )
|
for big in bigs.values():
|
||||||
bigs[f'big0']['big'].bis_links[0].write(frame)
|
if big['big'].bis_links[0].handle == event_handle:
|
||||||
bigs[f'big1']['big'].bis_links[0].write(frame)
|
frame = next(big['frames_iterator'] )
|
||||||
|
big['big'].bis_links[0].write(frame)
|
||||||
|
|
||||||
device.host.on('hci_number_of_completed_packets_event', on_packet_complete)
|
device.host.on('hci_number_of_completed_packets_event', on_packet_complete)
|
||||||
|
|
||||||
on_packet_complete('') # Send the first packet, to get the event loop running
|
# Send the first packet for each big, to get the event loop running
|
||||||
|
for big in bigs.values():
|
||||||
|
frame = next(big['frames_iterator'] )
|
||||||
|
big['big'].bis_links[0].write(frame)
|
||||||
|
|
||||||
while True:
|
while True:
|
||||||
await asyncio.sleep(1)
|
await asyncio.sleep(1)
|
||||||
@@ -278,7 +283,7 @@ def broadcast(global_conf: auracast_config.AuracastGlobalConfig, big_conf: List[
|
|||||||
|
|
||||||
# -----------------------------------------------------------------------------
|
# -----------------------------------------------------------------------------
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
logging.basicConfig(level=logging.DEBUG)
|
logging.basicConfig(level=logging.INFO)
|
||||||
|
|
||||||
global_conf = auracast_config.global_base_config
|
global_conf = auracast_config.global_base_config
|
||||||
|
|
||||||
@@ -291,9 +296,13 @@ if __name__ == "__main__":
|
|||||||
|
|
||||||
bigs = [
|
bigs = [
|
||||||
auracast_config.broadcast_de,
|
auracast_config.broadcast_de,
|
||||||
auracast_config.broadcast_en
|
auracast_config.broadcast_en,
|
||||||
|
#auracast_config.broadcast_fr,
|
||||||
]
|
]
|
||||||
global_conf.octets_per_frame=60# 48kbps@24kHz
|
#global_conf.auracast_sampling_rate_hz = 16000
|
||||||
|
#global_conf.octets_per_frame = 40 # 32kbps@16kHz
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
broadcast(
|
broadcast(
|
||||||
global_conf,
|
global_conf,
|
||||||
|
|||||||
Reference in New Issue
Block a user