feat(YouTube Music): Add Disable DRC audio patch https://github.com/inotia00/ReVanced_Extended/issues/2552

This commit is contained in:
inotia00
2024-12-15 19:08:31 +09:00
parent 7dfd817ba3
commit 4e85c77d53
7 changed files with 135 additions and 0 deletions

View File

@ -0,0 +1,64 @@
package app.revanced.patches.music.misc.drc
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patches.music.utils.compatibility.Constants.COMPATIBLE_PACKAGE
import app.revanced.patches.music.utils.extension.Constants.MISC_PATH
import app.revanced.patches.music.utils.patch.PatchList.DISABLE_DRC_AUDIO
import app.revanced.patches.music.utils.playservice.is_7_13_or_greater
import app.revanced.patches.music.utils.playservice.versionCheckPatch
import app.revanced.patches.music.utils.settings.CategoryType
import app.revanced.patches.music.utils.settings.ResourceUtils.updatePatchStatus
import app.revanced.patches.music.utils.settings.addSwitchPreference
import app.revanced.patches.music.utils.settings.settingsPatch
import app.revanced.util.fingerprint.matchOrThrow
import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction
private const val EXTENSION_CLASS_DESCRIPTOR =
"$MISC_PATH/DrcAudioPatch;"
@Suppress("unused")
val DrcAudioPatch = bytecodePatch(
DISABLE_DRC_AUDIO.title,
DISABLE_DRC_AUDIO.summary,
) {
compatibleWith(COMPATIBLE_PACKAGE)
dependsOn(
settingsPatch,
versionCheckPatch,
)
execute {
val fingerprint = if (is_7_13_or_greater) {
compressionRatioFingerprint
} else {
compressionRatioLegacyFingerprint
}
fingerprint.matchOrThrow(formatStreamModelConstructorFingerprint).let {
it.method.apply {
val insertIndex = it.patternMatch!!.endIndex
val insertRegister = getInstruction<TwoRegisterInstruction>(insertIndex - 1).registerA
addInstructions(
insertIndex,
"""
invoke-static {v$insertRegister}, $EXTENSION_CLASS_DESCRIPTOR->disableDrcAudio(F)F
move-result v$insertRegister
"""
)
}
}
addSwitchPreference(
CategoryType.MISC,
"revanced_disable_drc_audio",
"false"
)
updatePatchStatus(DISABLE_DRC_AUDIO)
}
}

View File

@ -0,0 +1,47 @@
package app.revanced.patches.music.misc.drc
import app.revanced.util.fingerprint.legacyFingerprint
import app.revanced.util.or
import com.android.tools.smali.dexlib2.AccessFlags
import com.android.tools.smali.dexlib2.Opcode
/**
* On YouTube, this class is 'Lcom/google/android/libraries/youtube/innertube/model/media/FormatStreamModel;'
* On YouTube Music, class names are obfuscated.
*/
internal val formatStreamModelConstructorFingerprint = legacyFingerprint(
name = "formatStreamModelConstructorFingerprint",
returnType = "V",
accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR,
literals = listOf(45374643L),
)
/**
* YouTube Music 7.13.52 ~
*/
internal val compressionRatioFingerprint = legacyFingerprint(
name = "compressionRatioFingerprint",
returnType = "Lj${'$'}/util/Optional;",
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
parameters = emptyList(),
opcodes = listOf(
Opcode.IF_EQZ,
Opcode.IGET,
Opcode.NEG_FLOAT,
)
)
/**
* ~ YouTube Music 7.12.52
*/
internal val compressionRatioLegacyFingerprint = legacyFingerprint(
name = "compressionRatioLegacyFingerprint",
returnType = "F",
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
parameters = emptyList(),
opcodes = listOf(
Opcode.IGET_OBJECT,
Opcode.IGET,
Opcode.RETURN,
)
)

View File

@ -45,6 +45,10 @@ internal enum class PatchList(
"Disable Cairo splash animation",
"Adds an option to disable Cairo splash animation."
),
DISABLE_DRC_AUDIO(
"Disable DRC audio",
"Adds an option to disable DRC (Dynamic Range Compression) audio."
),
DISABLE_AUTO_CAPTIONS(
"Disable auto captions",
"Adds an option to disable captions from being automatically enabled."

View File

@ -13,6 +13,8 @@ var is_6_42_or_greater = false
private set
var is_7_06_or_greater = false
private set
var is_7_13_or_greater = false
private set
var is_7_18_or_greater = false
private set
var is_7_20_or_greater = false
@ -38,6 +40,7 @@ val versionCheckPatch = resourcePatch(
is_6_36_or_greater = 240399000 <= playStoreServicesVersion
is_6_42_or_greater = 240999000 <= playStoreServicesVersion
is_7_06_or_greater = 242499000 <= playStoreServicesVersion
is_7_13_or_greater = 243199000 <= playStoreServicesVersion
is_7_18_or_greater = 243699000 <= playStoreServicesVersion
is_7_20_or_greater = 243899000 <= playStoreServicesVersion
is_7_23_or_greater = 244199000 <= playStoreServicesVersion