2022-07-09 20:07:14 +00:00
// From v0.4
2022-07-07 11:11:51 +00:00
navigator . mediaDevices . chromiumGetDisplayMedia =
navigator . mediaDevices . getDisplayMedia ;
2022-08-01 20:26:44 +00:00
function sleep ( ms ) {
return new Promise ( ( resolve ) => setTimeout ( resolve , ms ) ) ;
}
2022-07-07 11:11:51 +00:00
const getAudioDevice = async ( nameOfAudioDevice ) => {
await navigator . mediaDevices . getUserMedia ( {
audio : true ,
} ) ;
2022-08-02 09:56:08 +00:00
let audioDevice ;
while ( audioDevice === undefined ) {
let devices = await navigator . mediaDevices . enumerateDevices ( ) ;
audioDevice = devices . find ( ( { label } ) => label === nameOfAudioDevice ) ;
if ( ! audioDevice )
2022-08-02 10:41:32 +00:00
console . log (
` dsa: Did not find ' ${ nameOfAudioDevice } ', trying again in 100ms `
) ;
2022-08-02 09:56:08 +00:00
await sleep ( 100 ) ;
}
2022-08-02 10:41:32 +00:00
console . log ( ` dsa: Found ' ${ nameOfAudioDevice } ' ` ) ;
2022-07-07 11:11:51 +00:00
return audioDevice ;
} ;
2022-07-09 20:07:14 +00:00
function setGetDisplayMedia ( overrideArgs = undefined ) {
const getDisplayMedia = async ( ... args ) => {
var id ;
try {
let myDiscordAudioSink = await getAudioDevice (
"discord-screenaudio-virtmic"
) ;
id = myDiscordAudioSink . deviceId ;
} catch ( error ) {
id = "default" ;
}
let captureSystemAudioStream = await navigator . mediaDevices . getUserMedia ( {
audio : {
// We add our audio constraints here, to get a list of supported constraints use navigator.mediaDevices.getSupportedConstraints();
// We must capture a microphone, we use default since its the only deviceId that is the same for every Chromium user
deviceId : {
exact : id ,
} ,
// We want auto gain control, noise cancellation and noise suppression disabled so that our stream won't sound bad
autoGainControl : false ,
echoCancellation : false ,
noiseSuppression : false ,
// By default Chromium sets channel count for audio devices to 1, we want it to be stereo in case we find a way for Discord to accept stereo screenshare too
channelCount : 2 ,
// You can set more audio constraints here, bellow are some examples
//latency: 0,
//sampleRate: 48000,
//sampleSize: 16,
//volume: 1.0
} ,
} ) ;
let [ track ] = captureSystemAudioStream . getAudioTracks ( ) ;
const gdm = await navigator . mediaDevices . chromiumGetDisplayMedia (
... ( overrideArgs
? [ overrideArgs ]
: args || [ { video : true , audio : true } ] )
2022-07-07 11:11:51 +00:00
) ;
2022-07-09 20:07:14 +00:00
gdm . addTrack ( track ) ;
return gdm ;
} ;
navigator . mediaDevices . getDisplayMedia = getDisplayMedia ;
}
setGetDisplayMedia ( ) ;
const clonedElements = [ ] ;
const hiddenElements = [ ] ;
let wasStreamActive = false ;
setInterval ( ( ) => {
const streamActive =
document . getElementsByClassName ( "panel-2ZFCRb activityPanel-9icbyU" )
. length > 0 ;
if ( ! streamActive && wasStreamActive )
console . log ( "!discord-screenaudio-stream-stopped" ) ;
wasStreamActive = streamActive ;
if ( streamActive ) {
clonedElements . forEach ( ( el ) => {
el . remove ( ) ;
} ) ;
clonedElements . length = 0 ;
hiddenElements . forEach ( ( el ) => {
el . style . display = "block" ;
} ) ;
hiddenElements . length = 0 ;
} else {
2022-07-28 13:09:06 +00:00
for ( const el of [
document . getElementsByClassName ( "actionButtons-2vEOUh" ) ? . [ 0 ] ? . children [ 1 ] ,
document . querySelector (
".wrapper-3t3Yqv > div > div > div > div > .controlButton-2PMNom"
) ,
] ) {
if ( ! el ) continue ;
if ( el . classList . contains ( "discord-screenaudio-cloned" ) ) continue ;
el . classList . add ( "discord-screenaudio-cloned" ) ;
2022-07-09 20:07:14 +00:00
elClone = el . cloneNode ( true ) ;
elClone . title = "Share Your Screen with Audio" ;
elClone . addEventListener ( "click" , ( ) => {
console . log ( "!discord-screenaudio-start-stream" ) ;
} ) ;
const initialDisplay = el . style . display ;
window . discordScreenaudioStartStream = ( width , height , frameRate ) => {
2022-09-21 15:32:41 +00:00
window . discordScreenaudioResolutionString = ` ${ height } p ${ frameRate } FPS ` ;
2022-07-09 20:07:14 +00:00
setGetDisplayMedia ( {
audio : true ,
video : { width , height , frameRate } ,
} ) ;
el . click ( ) ;
el . style . display = initialDisplay ;
elClone . remove ( ) ;
} ;
el . style . display = "none" ;
el . parentNode . insertBefore ( elClone , el ) ;
clonedElements . push ( elClone ) ;
hiddenElements . push ( el ) ;
}
2022-07-07 11:11:51 +00:00
}
2022-07-09 20:07:14 +00:00
2022-07-14 12:43:52 +00:00
// Add about text in settings
2022-07-09 20:07:14 +00:00
if (
document . getElementsByClassName ( "dirscordScreenaudioAboutText" ) . length == 0
) {
for ( const el of document . getElementsByClassName ( "info-3pQQBb" ) ) {
2022-10-10 19:50:26 +00:00
let aboutEl ;
if ( window . discordScreenaudioKXMLGUI ) {
aboutEl = document . createElement ( "a" ) ;
aboutEl . addEventListener ( "click" , ( ) => {
console . log ( "!discord-screenaudio-about" ) ;
} ) ;
} else {
aboutEl = document . createElement ( "div" ) ;
}
2022-07-28 15:34:54 +00:00
aboutEl . innerText = ` discord-screenaudio ${ window . discordScreenaudioVersion } ` ;
2022-07-09 20:07:14 +00:00
aboutEl . style . fontSize = "12px" ;
aboutEl . style . color = "var(--text-muted)" ;
2022-07-28 15:34:54 +00:00
aboutEl . style . textTransform = "none" ;
2022-07-09 20:07:14 +00:00
aboutEl . classList . add ( "dirscordScreenaudioAboutText" ) ;
2022-10-10 19:50:26 +00:00
aboutEl . style . cursor = "pointer" ;
2022-07-09 20:07:14 +00:00
el . appendChild ( aboutEl ) ;
}
}
2022-07-14 12:43:52 +00:00
// Remove stream settings if stream is active
document . getElementById ( "manage-streams-change-windows" ) ? . remove ( ) ;
document . querySelector ( ` [aria-label="Stream Settings"] ` ) ? . remove ( ) ;
2022-09-21 15:32:41 +00:00
2022-10-10 19:50:26 +00:00
// Add event listener for keybind tab
if (
document
. getElementById ( "keybinds-tab" )
? . getElementsByClassName (
"container-3jbRo5 info-1hMolH fontSize16-3zr6Io browserNotice-1u-Y5o"
) . length
) {
const el = document
. getElementById ( "keybinds-tab" )
. getElementsByClassName ( "children-1xdcWE" ) [ 0 ] ;
const div = document . createElement ( "div" ) ;
div . style . marginBottom = "50px" ;
const button = document . createElement ( "button" ) ;
button . classList =
"button-f2h6uQ lookFilled-yCfaCM colorBrand-I6CyqQ sizeSmall-wU2dO- grow-2sR_-F" ;
button . innerText = "Edit Global Keybinds" ;
button . addEventListener ( "click" , ( ) => {
console . log ( "!discord-screenaudio-keybinds" ) ;
} ) ;
div . appendChild ( button ) ;
el . innerHTML = "" ;
el . appendChild ( div ) ;
}
const muteBtn = document . getElementsByClassName (
"button-12Fmur enabled-9OeuTA button-f2h6uQ lookBlank-21BCro colorBrand-I6CyqQ grow-2sR_-F"
) [ 0 ] ;
window . discordScreenaudioToggleMute = ( ) => muteBtn . click ( ) ;
const deafenBtn = document . getElementsByClassName (
"button-12Fmur enabled-9OeuTA button-f2h6uQ lookBlank-21BCro colorBrand-I6CyqQ grow-2sR_-F"
) [ 1 ] ;
window . discordScreenaudioToggleDeafen = ( ) => deafenBtn . click ( ) ;
2022-09-21 15:32:41 +00:00
if ( window . discordScreenaudioResolutionString ) {
for ( const el of document . getElementsByClassName (
"qualityIndicator-39wQDy"
) ) {
el . innerHTML = window . discordScreenaudioResolutionString ;
}
}
2022-07-26 13:48:01 +00:00
} , 500 ) ;
2022-07-27 13:02:51 +00:00
// Fix for broken discord notifications after restart
// (https://github.com/maltejur/discord-screenaudio/issues/17)
Notification . requestPermission ( ) ;