feat: mode écoute seule pour les server audio users (Master par groupe)
Un participant serveur peut être configuré sans publier de micro — il reçoit le mix du groupe et le sort sur un canal physique. - ServerAudioUser: flag publish (défaut true), sendAudio no-op si false - AudioBridgeManager: canPublish LiveKit selon flag, input_channel null si écoute - AudioBridge: passe publish à ServerAudioUser, log adapté - Electron UI: checkbox "Écoute seule" dans add/edit, badges 🎤/👂 dans table - main.js IPC: persist publish + input_channel null en écoute
This commit is contained in:
@@ -309,6 +309,7 @@ export class AudioBridge extends EventEmitter {
|
||||
groupId: userConfig.groupId,
|
||||
inputChannel: userConfig.inputChannel,
|
||||
outputChannel: userConfig.outputChannel,
|
||||
publish: userConfig.publish !== false,
|
||||
liveKitUrl: this.options.liveKitUrl,
|
||||
token: userConfig.token,
|
||||
sampleRate: this.options.sampleRate,
|
||||
@@ -338,7 +339,10 @@ export class AudioBridge extends EventEmitter {
|
||||
|
||||
await user.start();
|
||||
this.serverAudioUsers.set(userConfig.name, user);
|
||||
console.log(`✓ Server audio user "${userConfig.name}" démarré (entrée canal ${userConfig.inputChannel} → sortie canal ${userConfig.outputChannel}, room: ${userConfig.groupId})`);
|
||||
const modeStr = userConfig.publish !== false
|
||||
? `canal ${userConfig.inputChannel} → sortie canal ${userConfig.outputChannel ?? 'aucune'}`
|
||||
: `écoute seule → sortie canal ${userConfig.outputChannel ?? 'aucune'}`;
|
||||
console.log(`✓ Server audio user "${userConfig.name}" démarré (${modeStr}, room: ${userConfig.groupId})`);
|
||||
}
|
||||
|
||||
console.log(`✓ ${this.serverAudioUsers.size} server audio user(s) initialisés`);
|
||||
|
||||
@@ -66,10 +66,12 @@ class AudioBridgeManager extends EventEmitter {
|
||||
}
|
||||
);
|
||||
|
||||
const publish = user.publish !== false;
|
||||
|
||||
token.addGrant({
|
||||
room: groupId,
|
||||
roomJoin: true,
|
||||
canPublish: true,
|
||||
canPublish: publish,
|
||||
canSubscribe: true,
|
||||
canPublishData: true
|
||||
});
|
||||
@@ -77,12 +79,14 @@ class AudioBridgeManager extends EventEmitter {
|
||||
const jwt = await token.toJwt();
|
||||
|
||||
const outputChannel = user.output_channel ?? user.outputChannel;
|
||||
const rawInputChannel = user.input_channel ?? user.inputChannel;
|
||||
|
||||
serverAudioUsers.push({
|
||||
name: user.name,
|
||||
groupId,
|
||||
inputChannel: user.input_channel ?? user.inputChannel ?? 0,
|
||||
inputChannel: rawInputChannel !== null && rawInputChannel !== undefined ? rawInputChannel : null,
|
||||
outputChannel: outputChannel !== null && outputChannel !== undefined ? outputChannel : null,
|
||||
publish,
|
||||
token: jwt
|
||||
});
|
||||
|
||||
|
||||
@@ -17,10 +17,13 @@ class ServerAudioUser extends EventEmitter {
|
||||
super();
|
||||
|
||||
this.name = options.name;
|
||||
this.inputChannel = parseInt(options.inputChannel, 10);
|
||||
this.inputChannel = (options.inputChannel !== null && options.inputChannel !== undefined)
|
||||
? parseInt(options.inputChannel, 10)
|
||||
: null;
|
||||
this.outputChannel = (options.outputChannel !== null && options.outputChannel !== undefined)
|
||||
? parseInt(options.outputChannel, 10)
|
||||
: null;
|
||||
this.publish = options.publish !== false; // false = écoute seule
|
||||
this.groupId = options.groupId;
|
||||
this.frameSize = options.frameSize || 960;
|
||||
this.sampleRate = options.sampleRate || 48000;
|
||||
@@ -45,7 +48,8 @@ class ServerAudioUser extends EventEmitter {
|
||||
|
||||
_setupClientEvents() {
|
||||
this.client.on('connected', () => {
|
||||
console.log(`[ServerAudioUser:${this.name}] Connecté à room "${this.groupId}" (in:${this.inputChannel} → out:${this.outputChannel ?? 'aucune'})`);
|
||||
const mode = this.publish ? `in:${this.inputChannel} → out:${this.outputChannel ?? 'aucune'}` : `écoute → out:${this.outputChannel ?? 'aucune'}`;
|
||||
console.log(`[ServerAudioUser:${this.name}] Connecté à room "${this.groupId}" (${mode})`);
|
||||
this.emit('connected');
|
||||
});
|
||||
|
||||
@@ -78,7 +82,7 @@ class ServerAudioUser extends EventEmitter {
|
||||
* @param {Float32Array} float32Data - Données PCM normalisées [-1.0, 1.0]
|
||||
*/
|
||||
sendAudio(float32Data) {
|
||||
if (!this.client.isConnected) return;
|
||||
if (!this.publish || !this.client.isConnected) return;
|
||||
|
||||
const pcmBuffer = this._float32ToBuffer(float32Data);
|
||||
this.client.sendAudioData(pcmBuffer);
|
||||
|
||||
Reference in New Issue
Block a user