"normalize audio"
This commit is contained in:
parent
1ad7012e32
commit
ddbc3236fd
6 changed files with 96 additions and 8 deletions
8
index.js
8
index.js
|
@ -20,8 +20,9 @@ const configSchema = {
|
|||
"favoriteItems": []
|
||||
},
|
||||
"audio": {
|
||||
"quality": "extreme",
|
||||
"seamless_audio": true
|
||||
"quality": "990",
|
||||
"seamless_audio": true,
|
||||
"normalization": false,
|
||||
},
|
||||
"visual": {
|
||||
"theme": "",
|
||||
|
@ -44,6 +45,9 @@ const configSchema = {
|
|||
"auth_token": "",
|
||||
"enabledRemoveFeaturingArtists" : true,
|
||||
"NowPlaying": "true"
|
||||
},
|
||||
"advanced": {
|
||||
"AudioContext" : true,
|
||||
}
|
||||
}
|
||||
|
||||
|
|
63
src/renderer/audio/audio.js
Normal file
63
src/renderer/audio/audio.js
Normal file
|
@ -0,0 +1,63 @@
|
|||
var CiderAudio = {
|
||||
context : null,
|
||||
source : null,
|
||||
audioNodes : {
|
||||
gainNode : null,
|
||||
compressorNode : null,
|
||||
},
|
||||
init: function (cb = function () { }) {
|
||||
//AudioOutputs.fInit = true;
|
||||
searchInt = setInterval(function () {
|
||||
if (document.getElementById("apple-music-player")) {
|
||||
//AudioOutputs.eqReady = true;
|
||||
document.getElementById("apple-music-player").crossOrigin = "anonymous";
|
||||
CiderAudio.connectContext(document.getElementById("apple-music-player"), 0);
|
||||
|
||||
cb();
|
||||
clearInterval(searchInt);
|
||||
}
|
||||
}, 1000);
|
||||
},
|
||||
connectContext: function (mediaElem){
|
||||
CiderAudio.context = new (window.AudioContext || window.webkitAudioContext);
|
||||
CiderAudio.source = CiderAudio.context.createMediaElementSource(mediaElem);
|
||||
CiderAudio.audioNodes.gainNode = CiderAudio.context.createGain()
|
||||
CiderAudio.source.connect(CiderAudio.audioNodes.gainNode);
|
||||
CiderAudio.audioNodes.gainNode.connect(CiderAudio.context.destination);
|
||||
if(app.cfg.audio.normalization){
|
||||
CiderAudio.normalizerOn()
|
||||
}
|
||||
},
|
||||
normalizerOn: function (){
|
||||
let tuna = Tuna(CiderAudio.context)
|
||||
if (!CiderAudio.audioNodes.compressorNode){
|
||||
CiderAudio.audioNodes.compressorNode = new tuna.Compressor({
|
||||
threshold: -80, //-100 to 0
|
||||
makeupGain: 5, //0 and up (in decibels)
|
||||
attack: 2, //0 to 1000
|
||||
release: 200, //0 to 3000
|
||||
ratio: 8, //1 to 20
|
||||
knee: 0, //0 to 40
|
||||
automakeup: false, //true/false
|
||||
bypass: 0
|
||||
});
|
||||
}
|
||||
try{
|
||||
CiderAudio.audioNodes.gainNode.disconnect(CiderAudio.context.destination);
|
||||
} catch (e){}
|
||||
CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.compressorNode);
|
||||
CiderAudio.audioNodes.compressorNode.connect(CiderAudio.context.destination);
|
||||
},
|
||||
normalizerOff: function (){
|
||||
try{
|
||||
CiderAudio.audioNodes.compressorNode.disconnect();
|
||||
CiderAudio.audioNodes.compressorNode = null
|
||||
} catch (e){}
|
||||
CiderAudio.audioNodes.gainNode.connect(CiderAudio.context.destination);
|
||||
}
|
||||
|
||||
}
|
||||
if (app.cfg.advanced.AudioContext){
|
||||
CiderAudio.init()
|
||||
|
||||
}
|
1
src/renderer/audio/tuna.js
Normal file
1
src/renderer/audio/tuna.js
Normal file
File diff suppressed because one or more lines are too long
|
@ -390,6 +390,9 @@ const app = new Vue({
|
|||
window.localStorage.setItem("currentQueue", JSON.stringify(app.mk.queue.items))
|
||||
};
|
||||
|
||||
// Load saved quality
|
||||
app.mk.bitrate = app.cfg.audio.quality
|
||||
|
||||
// load last played track
|
||||
try {
|
||||
let lastItem = window.localStorage.getItem("currentTrack")
|
||||
|
|
|
@ -585,5 +585,7 @@
|
|||
}
|
||||
</script>
|
||||
<script src="index.js?v=1"></script>
|
||||
<script src="/audio/tuna.js?v=1"></script>
|
||||
<script src="/audio/audio.js?v=1"></script>
|
||||
</body>
|
||||
</html>
|
|
@ -9,10 +9,10 @@
|
|||
Audio Quality
|
||||
</div>
|
||||
<div class="md-option-segment md-option-segment_auto">
|
||||
<select class="md-select" style="width:180px;">
|
||||
<option value="extreme">Extreme</option>
|
||||
<option value="high">High</option>
|
||||
<option value="low">Low</option>
|
||||
<select class="md-select" style="width:180px;" v-model="app.cfg.audio.quality" v-on:change="changeAudioQuality">
|
||||
<option value="990">Extreme</option>
|
||||
<option value="256">High</option>
|
||||
<option value="64">Low</option>
|
||||
<option value="auto">Auto</option>
|
||||
</select>
|
||||
</div>
|
||||
|
@ -25,6 +25,14 @@
|
|||
<input type="checkbox" v-model="app.cfg.audio.seamless_audio" switch/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="md-option-line">
|
||||
<div class="md-option-segment">
|
||||
Audio Normalization
|
||||
</div>
|
||||
<div class="md-option-segment md-option-segment_auto">
|
||||
<input type="checkbox" v-model="app.cfg.audio.normalization" v-on:change="toggleNormalization" switch/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="md-option-header">
|
||||
<span>Visual</span>
|
||||
</div>
|
||||
|
@ -72,7 +80,7 @@
|
|||
<small>(Requires relaunch)</small>
|
||||
</div>
|
||||
<div class="md-option-segment md-option-segment_auto">
|
||||
<select class="md-select" style="width:180px;" v-model="app.cfg.visual.hw_acceleration">
|
||||
<select class="md-select" style="width:180px;" v-model="app.cfg.visual.hw_acceleration" >
|
||||
<option value="default">Default</option>
|
||||
<option value="webgpu">WebGPU</option>
|
||||
<option value="disabled">Disabled</option>
|
||||
|
@ -547,7 +555,14 @@
|
|||
}
|
||||
},
|
||||
methods: {
|
||||
|
||||
toggleNormalization : function(){
|
||||
if (app.cfg.audio.normalization){
|
||||
CiderAudio.normalizerOn()
|
||||
} else {CiderAudio.normalizerOff()}
|
||||
},
|
||||
changeAudioQuality : function(){
|
||||
app.mk.bitrate = app.cfg.audio.quality
|
||||
}
|
||||
}
|
||||
})
|
||||
</script>
|
Loading…
Add table
Add a link
Reference in a new issue