322 lines
11 KiB
JavaScript
322 lines
11 KiB
JavaScript
/*
|
|
Copyright (C) 2015 Borsato Ivano
|
|
|
|
The JavaScript code in this page is free software: you can
|
|
redistribute it and/or modify it under the terms of the GNU
|
|
General Public License (GNU GPL) as published by the Free Software
|
|
Foundation, either version 3 of the License, or (at your option)
|
|
any later version. The code is distributed WITHOUT ANY WARRANTY;
|
|
without even the implied warranty of MERCHANTABILITY or FITNESS
|
|
FOR A PARTICULAR PURPOSE. See the GNU GPL for more details.
|
|
*/
|
|
|
|
'use strict';
|
|
|
|
import GObject from 'gi://GObject';
|
|
import GIRepository from 'gi://GIRepository';
|
|
GIRepository.Repository.prepend_search_path('/usr/lib/gnome-shell');
|
|
GIRepository.Repository.prepend_library_path('/usr/lib/gnome-shell');
|
|
GIRepository.Repository.prepend_search_path('/usr/lib64/gnome-shell');
|
|
GIRepository.Repository.prepend_library_path('/usr/lib64/gnome-shell');
|
|
import Gvc from 'gi://Gvc';
|
|
|
|
import * as Lib from './convenience.js';
|
|
import * as Settings from './settings.js';
|
|
import * as Ext from './extension.js';
|
|
|
|
/**
|
|
* @type {MixerAudio}
|
|
*/
|
|
var MixerAudio = GObject.registerClass({
|
|
GTypeName: 'EasyScreenCast_MixerAudio',
|
|
}, class MixerAudio extends GObject.Object {
|
|
constructor() {
|
|
super();
|
|
Lib.TalkativeLog('-#-mixer constructor');
|
|
|
|
this._mixerControl = this._createMixerControl();
|
|
this._isConnected = true;
|
|
this._mixerControl.connect('state-changed', () =>
|
|
this._onChangeStatePAC()
|
|
);
|
|
|
|
// more log for debug
|
|
if (Lib.debugEnabled) {
|
|
this._mixerControl.connect('stream_added', (control, id) => {
|
|
this._onStreamAdd(control, id);
|
|
});
|
|
this._mixerControl.connect('stream_removed', (control, id) => {
|
|
this._onStreamRemove(control, id);
|
|
});
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @returns {Gvc.MixerControl}
|
|
* @private
|
|
*/
|
|
_createMixerControl() {
|
|
Lib.TalkativeLog('-#-mixer create');
|
|
|
|
// https://gitlab.gnome.org/GNOME/libgnome-volume-control
|
|
var _mixerTmp = new Gvc.MixerControl({
|
|
name: 'ESC Mixer Control',
|
|
});
|
|
_mixerTmp.open();
|
|
|
|
return _mixerTmp;
|
|
}
|
|
|
|
_onChangeStatePAC() {
|
|
Lib.TalkativeLog('-#-mixer state changed');
|
|
|
|
switch (this._mixerControl.get_state()) {
|
|
case Gvc.MixerControlState.CLOSED:
|
|
Lib.TalkativeLog('-#-Mixer close');
|
|
this._isConnected = false;
|
|
break;
|
|
case Gvc.MixerControlState.CONNECTING:
|
|
Lib.TalkativeLog('-#-Mixer connecting');
|
|
this._isConnected = false;
|
|
break;
|
|
case Gvc.MixerControlState.FAILED:
|
|
Lib.TalkativeLog('-#-Mixer failed');
|
|
this._isConnected = false;
|
|
break;
|
|
case Gvc.MixerControlState.READY:
|
|
Lib.TalkativeLog('-#-Mixer ready');
|
|
this._isConnected = true;
|
|
|
|
// more log for debug
|
|
if (Lib.debugEnabled)
|
|
this._getInfoPA();
|
|
|
|
break;
|
|
default:
|
|
Lib.TalkativeLog('-#-Mixer UNK');
|
|
this._isConnected = false;
|
|
break;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Gets a list of input audio sources.
|
|
*
|
|
* @returns {Array}
|
|
*/
|
|
getListInputAudio() {
|
|
Lib.TalkativeLog('-#-get list input audio');
|
|
|
|
if (this._isConnected) {
|
|
var arrayTmp = [];
|
|
|
|
var tmpSinks = this._mixerControl.get_sinks();
|
|
Lib.TalkativeLog(`-#-Mixer sink -> ${tmpSinks.length}`);
|
|
for (let x in tmpSinks) {
|
|
Lib.TalkativeLog(`-#-sink index: ${tmpSinks[x].index}`);
|
|
Lib.TalkativeLog(`-#-sink name: ${tmpSinks[x].name}`);
|
|
Lib.TalkativeLog(
|
|
`-#-sink description: ${tmpSinks[x].description}`
|
|
);
|
|
Lib.TalkativeLog(`-#-sink port: ${tmpSinks[x].port}`);
|
|
|
|
arrayTmp.push({
|
|
desc: tmpSinks[x].description,
|
|
name: tmpSinks[x].name,
|
|
port: tmpSinks[x].port,
|
|
sortable: true,
|
|
resizeable: true,
|
|
});
|
|
}
|
|
|
|
var tmpSources = this._mixerControl.get_sources();
|
|
Lib.TalkativeLog(`-#-Mixer sources -> ${tmpSources.length}`);
|
|
for (let x in tmpSources) {
|
|
Lib.TalkativeLog(`-#-source index: ${tmpSources[x].index}`);
|
|
Lib.TalkativeLog(`-#-source name: ${tmpSources[x].name}`);
|
|
Lib.TalkativeLog(
|
|
`-#-source description: ${tmpSources[x].description}`
|
|
);
|
|
Lib.TalkativeLog(`-#-source port: ${tmpSources[x].port}`);
|
|
|
|
arrayTmp.push({
|
|
desc: tmpSources[x].description,
|
|
name: tmpSources[x].name,
|
|
port: tmpSources[x].port,
|
|
sortable: true,
|
|
resizeable: true,
|
|
});
|
|
}
|
|
|
|
Lib.TalkativeLog(`-#-MIXER SOURCE TOT -> ${arrayTmp.length}`);
|
|
|
|
return arrayTmp;
|
|
} else {
|
|
Lib.TalkativeLog('-#-Error lib pulse NOT present or NOT respond');
|
|
}
|
|
|
|
return [];
|
|
}
|
|
|
|
/**
|
|
* @returns {string}
|
|
*/
|
|
getAudioSource() {
|
|
Lib.TalkativeLog('-#-get source audio choosen');
|
|
|
|
var arrtmp = this.getListInputAudio();
|
|
var index = Ext.Indicator.getSettings().getOption('i', Settings.INPUT_AUDIO_SOURCE_SETTING_KEY) - 2;
|
|
|
|
if (index >= 0 && index < arrtmp.length) {
|
|
return arrtmp[index].name;
|
|
} else {
|
|
Lib.TalkativeLog('-#-ERROR, audio source missing');
|
|
Ext.Indicator.getSettings().setOption(Settings.INPUT_AUDIO_SOURCE_SETTING_KEY, 0);
|
|
|
|
return '';
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @param {Gvc.MixerControl} control the mixer control to which the stream was added
|
|
* @param {number} id the stream id
|
|
* @private
|
|
*/
|
|
_onStreamAdd(control, id) {
|
|
Lib.TalkativeLog(`-#-mixer stream add - ID: ${id}`);
|
|
var streamTmp = control.lookup_stream_id(id);
|
|
|
|
if (
|
|
streamTmp.name === 'GNOME Shell' &&
|
|
streamTmp.description === 'Record Stream'
|
|
) {
|
|
Lib.TalkativeLog('-#-stream gnome recorder captured');
|
|
|
|
Lib.TalkativeLog(`-#-stream index: ${streamTmp.index}`);
|
|
Lib.TalkativeLog(`-#-stream card index: ${streamTmp.card_index}`);
|
|
Lib.TalkativeLog(`-#-application_ID: ${streamTmp.application_id}`);
|
|
Lib.TalkativeLog(`-#-stream name: ${streamTmp.name}`);
|
|
Lib.TalkativeLog(`-#-stream icon: ${streamTmp.icon_name}`);
|
|
Lib.TalkativeLog(`-#-stream description: ${streamTmp.description}`);
|
|
Lib.TalkativeLog(`-#-stream port: ${streamTmp.port}`);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @param {Gvc.MixerControl} control the mixer control from where the stream was removed
|
|
* @param {number} id stream id
|
|
* @private
|
|
*/
|
|
_onStreamRemove(control, id) {
|
|
Lib.TalkativeLog(`-#-mixer stream remove - ID: ${id}`);
|
|
// note: the stream has been already removed, so
|
|
// control.lookup_stream_id(id) won't return anything
|
|
}
|
|
|
|
/**
|
|
* @private
|
|
*/
|
|
_getInfoPA() {
|
|
var tmp = this._mixerControl.get_cards();
|
|
Lib.TalkativeLog(`#-# mixer cards -> ${tmp.length}`);
|
|
for (let x in tmp) {
|
|
Lib.TalkativeLog(`-#-card index: ${tmp[x].index}`);
|
|
Lib.TalkativeLog(`-#-card name: ${tmp[x].name}`);
|
|
Lib.TalkativeLog(`-#-card icon: ${tmp[x].icon_name}`);
|
|
Lib.TalkativeLog(`-#-card profile: ${tmp[x].profile}`);
|
|
Lib.TalkativeLog(`-#-card human profile: ${tmp[x].human_profile}`);
|
|
}
|
|
|
|
tmp = this._mixerControl.get_sources();
|
|
Lib.TalkativeLog(`#-# mixer sources -> ${tmp.length}`);
|
|
for (let x in tmp) {
|
|
Lib.TalkativeLog(`-#-source index: ${tmp[x].index}`);
|
|
Lib.TalkativeLog(`-#-application_ID: ${tmp[x].application_id}`);
|
|
Lib.TalkativeLog(`-#-source name: ${tmp[x].name}`);
|
|
Lib.TalkativeLog(`-#-source icon: ${tmp[x].icon_name}`);
|
|
Lib.TalkativeLog(`-#-source description: ${tmp[x].description}`);
|
|
Lib.TalkativeLog(`-#-source port: ${tmp[x].port}`);
|
|
}
|
|
|
|
tmp = this._mixerControl.get_source_outputs();
|
|
Lib.TalkativeLog(`#-# mixer source output -> ${tmp.length}`);
|
|
for (let x in tmp) {
|
|
Lib.TalkativeLog(`-#-sourceouput index: ${tmp[x].index}`);
|
|
Lib.TalkativeLog(`-#-application_ID: ${tmp[x].application_id}`);
|
|
Lib.TalkativeLog(`-#-sourceouput name: ${tmp[x].name}`);
|
|
Lib.TalkativeLog(`-#-sourceoutput icon: ${tmp[x].icon_name}`);
|
|
Lib.TalkativeLog(
|
|
`-#-sourceoutput description: ${tmp[x].description}`
|
|
);
|
|
Lib.TalkativeLog(`-#-sourceoutput port: ${tmp[x].port}`);
|
|
}
|
|
|
|
tmp = this._mixerControl.get_sinks();
|
|
Lib.TalkativeLog(`#-# mixer sink -> ${tmp.length}`);
|
|
for (let x in tmp) {
|
|
Lib.TalkativeLog(`-#-sink index: ${tmp[x].index}`);
|
|
Lib.TalkativeLog(`-#-application_ID: ${tmp[x].application_id}`);
|
|
Lib.TalkativeLog(`-#-sink name: ${tmp[x].name}`);
|
|
Lib.TalkativeLog(`-#-sink icon: ${tmp[x].icon_name}`);
|
|
Lib.TalkativeLog(`-#-sink description: ${tmp[x].description}`);
|
|
Lib.TalkativeLog(`-#-sink port: ${tmp[x].port}`);
|
|
}
|
|
|
|
tmp = this._mixerControl.get_sink_inputs();
|
|
Lib.TalkativeLog(`#-# mixer sink input -> ${tmp.length}`);
|
|
for (let x in tmp) {
|
|
Lib.TalkativeLog(`-#-sink input index: ${tmp[x].index}`);
|
|
Lib.TalkativeLog(`-#-application_ID: ${tmp[x].application_id}`);
|
|
Lib.TalkativeLog(`-#-sink input name: ${tmp[x].name}`);
|
|
Lib.TalkativeLog(`-#-sink input icon: ${tmp[x].icon_name}`);
|
|
Lib.TalkativeLog(
|
|
`-#-sink input description: ${tmp[x].description}`
|
|
);
|
|
Lib.TalkativeLog(`-#-sink input port: ${tmp[x].port}`);
|
|
}
|
|
|
|
tmp = this._mixerControl.get_streams();
|
|
Lib.TalkativeLog(`#-# mixer stream -> ${tmp.length}`);
|
|
for (let x in tmp) {
|
|
Lib.TalkativeLog(`-#-STREAM index: ${tmp[x].index}`);
|
|
Lib.TalkativeLog(`-#-application_ID: ${tmp[x].application_id}`);
|
|
Lib.TalkativeLog(`-#-stream name: ${tmp[x].name}`);
|
|
Lib.TalkativeLog(`-#-stream icon: ${tmp[x].icon_name}`);
|
|
Lib.TalkativeLog(`-#-stream description: ${tmp[x].description}`);
|
|
|
|
var tmp1 = tmp[x].get_ports();
|
|
for (let y in tmp1) {
|
|
Lib.TalkativeLog(`-##-stream port number: ${y}`);
|
|
Lib.TalkativeLog(`-##-stream port name: ${tmp1[y].port}`);
|
|
Lib.TalkativeLog(
|
|
`-##-stream port human name: ${tmp1[y].human_port}`
|
|
);
|
|
Lib.TalkativeLog(
|
|
`-##-stream port priority: ${tmp1[y].priority}`
|
|
);
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @returns {boolean}
|
|
*/
|
|
checkAudio() {
|
|
Lib.TalkativeLog(`-#-check GVC lib presence: ${this._isConnected}`);
|
|
|
|
return this._isConnected;
|
|
}
|
|
|
|
/**
|
|
* Destroy mixer control
|
|
*/
|
|
destroy() {
|
|
if (this._mixerControl) {
|
|
this._mixerControl.close();
|
|
this._mixerControl = null;
|
|
}
|
|
}
|
|
});
|
|
|
|
export {MixerAudio};
|