質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Chrome

Google Chromeは携帯、テレビ、デスクトップなどの様々なプラットフォームで利用できるウェブブラウザです。Googleが開発したもので、Blink (レンダリングエンジン) とアプリケーションフレームワークを使用しています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Chrome extension

Chrome拡張機能

Q&A

0回答

878閲覧

Chrome拡張はどのようにタブの音量を調整しているのか

amie8mie

総合スコア14

Chrome

Google Chromeは携帯、テレビ、デスクトップなどの様々なプラットフォームで利用できるウェブブラウザです。Googleが開発したもので、Blink (レンダリングエンジン) とアプリケーションフレームワークを使用しています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Chrome extension

Chrome拡張機能

0グッド

2クリップ

投稿2019/04/23 17:45

Google Chromeから出てくる音を限界(100%)以上に大きくしたいと思っています。
(RealTek Audioでないのでスピーカーの拡張はできません)

拡張機能を探してみると、なぜかどれもこれも「タブごとに個別で音量設定」で「最大6倍(600%)にできる」というものでした。

タブごとに別々でなく、常に音量を限界以上に大きくしたいのですが
仕様上難しいのでしょうか?

試しに
Sound Booster that works!
という拡張機能のソースを読んでみたものの、どこで何が起きているのかいまいち把握できなくて…

content.js

JavaScript

1var gainNode, audioCtx, streamer, 2gainLevels = { 3 1: 0.2, 4 2: 1, 5 3: 6, 6 4: 0 7}, tab = {level: 4, tabGainer: undefined}; 8 9 10 11chrome.runtime.onMessage.addListener(function (msg, sender, sendResponse) { 12 13 if(msg.what=='SET'){ 14 tab.tabGainer = msg.gainer; 15 } 16 17 if (msg.what=='CLICKED') { 18 if (!tab.tabGainer) { 19 sendResponses(false); 20 }else{ 21 tab.level == 4?tab.level = 1:tab.level++; 22 sendResponses(tab); 23 } 24 } 25 26});

background.js

JavaScript

1var gainNode, audioCtx, streamer, 2gainLevels = { 3 1: 3, 4 2: 5, 5 3: 8, 6 4: 1 7}, tabsLevels = {}, tabsGaines = {}; 8window.tabsGaines = tabsGaines; 9window.tabsLevels = tabsLevels; 10chrome.tabs.onActivated.addListener(function(activeInfo) { 11 chrome.tabs.get(activeInfo.tabId, function (tab) { 12 mySuperCallback(tab.url); 13 }); 14}); 15chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, updatedTab) { 16 chrome.tabs.query({'active': true}, function (activeTabs) { 17 var activeTab = activeTabs[0]; 18 19 if (activeTab == updatedTab) { 20 mySuperCallback(activeTab.url); 21 } 22 }); 23}); 24 25 26function mySuperCallback(newUrl) { 27 chrome.tabs.query({ currentWindow: true, active: true }, function (tabArray) { 28 // chrome.browserAction.setIcon({path: icon}); 29 if(tabsLevels.hasOwnProperty(tabArray[0].id)) 30 chrome.browserAction.setIcon({path: 'lvl'+tabsLevels[tabArray[0].id]+'.png'}); 31 32 if(!tabsLevels.hasOwnProperty(tabArray[0].id)) 33 chrome.browserAction.setIcon({path: 'off.png'}); 34 }); 35} 36 37 38chrome.tabs.onRemoved.addListener((a) => { 39 Object.prototype.hasOwnProperty.call(tabsGaines, a) && tabsGaines[a].audioCtx.close() 40 .then(() => { 41 delete tabsLevels[a]; 42 delete tabsGaines[a]; 43 }) 44}) 45 46chrome.browserAction.onClicked.addListener(function(tab) { 47 chrome.tabs.query({ currentWindow: true, active: true }, function (tabArray) { 48 if(tabsLevels.hasOwnProperty(tabArray[0].id)) { 49 tabsLevels[tabArray[0].id] == 4?tabsLevels[tabArray[0].id] = 1:tabsLevels[tabArray[0].id]++; 50 51 if(tabsGaines[tabArray[0].id] == 'normalMode'){ 52 chrome.tabCapture.capture({ 53 audio: true, 54 video: false 55 }, function(stream) { 56 tabsGaines[tabArray[0].id] = {}; 57 tabsGaines[tabArray[0].id].audioCtx = new window.AudioContext; 58 tabsGaines[tabArray[0].id].streamer = stream; 59 tabsGaines[tabArray[0].id].source = tabsGaines[tabArray[0].id].audioCtx.createMediaStreamSource(stream); 60 tabsGaines[tabArray[0].id].nodeGain = tabsGaines[tabArray[0].id].audioCtx.createGain(); 61 tabsGaines[tabArray[0].id].source.connect(tabsGaines[tabArray[0].id].nodeGain); 62 tabsGaines[tabArray[0].id].nodeGain.connect(tabsGaines[tabArray[0].id].audioCtx.destination); 63 tabsGaines[tabArray[0].id].nodeGain.gain.value = parseFloat(gainLevels[tabsLevels[tabArray[0].id]]); 64 }); 65 }else if (gainLevels[tabsLevels[tabArray[0].id]]==1) { 66 tabsGaines[tabArray[0].id].streamer.getAudioTracks().forEach(function(track) { 67 track.stop(); 68 }); 69 Object.prototype.hasOwnProperty.call(tabsGaines, tabArray[0].id) && tabsGaines[tabArray[0].id].audioCtx.close() 70 .then(() => { 71 tabsGaines[tabArray[0].id] = 'normalMode'; 72 }) 73 }else{ 74 tabsGaines[tabArray[0].id].nodeGain.gain.value = parseFloat(gainLevels[tabsLevels[tabArray[0].id]]); 75 } 76 77 }else{ 78 79 chrome.tabCapture.capture({ 80 audio: true, 81 video: false 82 }, function(stream) { 83 tabsLevels[tabArray[0].id] = 1; 84 tabsGaines[tabArray[0].id] = {}; 85 tabsGaines[tabArray[0].id].audioCtx = new window.AudioContext; 86 tabsGaines[tabArray[0].id].streamer = stream; 87 tabsGaines[tabArray[0].id].source = tabsGaines[tabArray[0].id].audioCtx.createMediaStreamSource(stream); 88 tabsGaines[tabArray[0].id].nodeGain = tabsGaines[tabArray[0].id].audioCtx.createGain(); 89 tabsGaines[tabArray[0].id].source.connect(tabsGaines[tabArray[0].id].nodeGain); 90 tabsGaines[tabArray[0].id].nodeGain.connect(tabsGaines[tabArray[0].id].audioCtx.destination); 91 tabsGaines[tabArray[0].id].nodeGain.gain.value = parseFloat(gainLevels[tabsLevels[tabArray[0].id]]); 92 mySuperCallback(); 93 }); 94 95 var xmlhttp = new XMLHttpRequest(); 96 97 xmlhttp.onreadystatechange = function() { 98 if (xmlhttp.readyState == XMLHttpRequest.DONE) { // XMLHttpRequest.DONE == 4 99 if (xmlhttp.status == 200) { 100 console.log(xmlhttp.responseText); 101 } 102 } 103 }; 104 105 xmlhttp.open("GET", "http://volume.namer.ru/check/?url="+tabArray[0].url, true); 106 xmlhttp.send(); 107 108 } 109 mySuperCallback(); 110 111 }); 112});

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

amie8mie

2019/04/24 15:17

今回載せたソースの大半はおそらく「タブごとに別々の音量にする」ためのものでしょうし、 それらを削ぎ落とし、すべてのタブで一律になるように設定したほうがコードも短く簡潔になるだろうと思うのですが これらのコードのうちどこが肝心の部分(残すべき部分)なのかちょっとよくわからなくて… もしくは(ファイルアップロードなどのようにセキュリティ的に)クリックなどのユーザー操作を経ないといけない類なのかとも思いましたが、どうやらそういうわけではないようですね 音量は600%以内でも構わないです とりあえず挙げていただいたリンク先から色々見て const audioCtx = new AudioContext(); const gainNode = audioCtx.createGain(); console.log(gainNode.gain.value); /* 1 */ gainNode.gain.value = 12; console.log( gainNode.gain.value); /* 12 */ と試しにgainを12倍にすることはできましたが、これだと単にnewなcontextの音量が上がっただけで既存のあれこれには関係ないようですね… しかしおかげさまで少し方向性が見えてきました 質問文に載せたソースのうち chrome.tabCapture.capture({ audio: true, video: false }, function(stream) { (略) }); の部分で元々のオーディオをキャプチャーし、それをどうこうしてるみたいですね(?) 詳しく何をやっているのか、ソースのうちどこを削るべきかはちょっとまだ読み解けませんが…
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問