blob: 745ed634b60f718ecfd870dd740b58d3067b1972 [file] [edit]
// Copyright 2026 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
use crate::types::{CodecCapabilitySetting, Configuration};
use bt_pacs::PacRecord;
use std::collections::HashMap;
/// Maps discovered capabilities and endpoints to supported configurations.
pub fn map_capabilities(
pac_records: &[PacRecord],
sink_ase_count: usize,
source_ase_count: usize,
) -> HashMap<Configuration, Vec<CodecCapabilitySetting>> {
let mut mapping = HashMap::new();
// TODO: Implement actual mapping logic based on PAC records.
// This is a skeleton implementation that returns hardcoded values if resources
// are available.
if pac_records.is_empty() {
return mapping;
}
// Configuration 1: Mono Audio Sink (Client to Server)
// Requires 1 Sink ASE.
if sink_ase_count >= 1 {
mapping.insert(
Configuration::MonoAudioSink,
vec![CodecCapabilitySetting::Lc3_48_2, CodecCapabilitySetting::Lc3_16_2],
);
}
// Configuration 3: Conversational (Bidirectional)
// Requires 1 Sink ASE and 1 Source ASE.
if sink_ase_count >= 1 && source_ase_count >= 1 {
mapping.insert(Configuration::Conversational, vec![CodecCapabilitySetting::Lc3_16_2]);
}
mapping
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_map_capabilities_empty() {
let mapping = map_capabilities(&[], 0, 0);
assert!(mapping.is_empty());
}
#[test]
fn test_map_capabilities_with_resources() {
// Create a dummy PacRecord
// We need to mock it or use a real one if easy.
// For now, we just need a non-empty slice to trigger the skeleton logic.
let pac_records = vec![PacRecord {
codec_id: bt_common::core::CodecId::Assigned(bt_common::core::CodingFormat::Lc3),
codec_specific_capabilities: vec![],
metadata: vec![],
}];
let mapping = map_capabilities(&pac_records, 1, 1);
assert!(mapping.contains_key(&Configuration::MonoAudioSink));
assert!(mapping.contains_key(&Configuration::Conversational));
}
}