123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319 |
- /*
- 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}
- */
- export const 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;
- }
- }
- });
|