mirror of
https://github.com/revanced/revanced-patches
synced 2024-06-02 11:26:20 +02:00
57 lines
2.2 KiB
Kotlin
57 lines
2.2 KiB
Kotlin
package app.revanced.patches.music.audio.codecs.patch
|
|
|
|
import app.revanced.patcher.annotation.Description
|
|
import app.revanced.patcher.annotation.Name
|
|
import app.revanced.patcher.annotation.Version
|
|
import app.revanced.patcher.data.BytecodeContext
|
|
import app.revanced.patcher.data.toMethodWalker
|
|
import app.revanced.patcher.patch.BytecodePatch
|
|
import app.revanced.patcher.patch.PatchResult
|
|
import app.revanced.patcher.patch.PatchResultSuccess
|
|
import app.revanced.patcher.patch.annotations.Patch
|
|
import app.revanced.patcher.util.smali.toInstruction
|
|
import app.revanced.patches.music.annotations.MusicCompatibility
|
|
import app.revanced.patches.music.audio.codecs.fingerprints.AllCodecsReferenceFingerprint
|
|
import app.revanced.patches.music.audio.codecs.fingerprints.CodecsLockFingerprint
|
|
import org.jf.dexlib2.Opcode
|
|
|
|
@Patch
|
|
@Name("codecs-unlock")
|
|
@Description("Adds more audio codec options. The new audio codecs usually result in better audio quality.")
|
|
@MusicCompatibility
|
|
@Version("0.0.1")
|
|
class CodecsUnlockPatch : BytecodePatch(
|
|
listOf(
|
|
CodecsLockFingerprint, AllCodecsReferenceFingerprint
|
|
)
|
|
) {
|
|
override fun execute(context: BytecodeContext): PatchResult {
|
|
val codecsLockResult = CodecsLockFingerprint.result!!
|
|
|
|
val implementation = codecsLockResult.mutableMethod.implementation!!
|
|
|
|
val scanResultStartIndex = codecsLockResult.scanResult.patternScanResult!!.startIndex
|
|
val instructionIndex = scanResultStartIndex +
|
|
if (implementation.instructions[scanResultStartIndex - 1].opcode == Opcode.CHECK_CAST) {
|
|
// for 5.16.xx and lower
|
|
-3
|
|
} else {
|
|
// since 5.17.xx
|
|
-2
|
|
}
|
|
|
|
val allCodecsResult = AllCodecsReferenceFingerprint.result!!
|
|
val allCodecsMethod =
|
|
context.toMethodWalker(allCodecsResult.method)
|
|
.nextMethod(allCodecsResult.scanResult.patternScanResult!!.startIndex)
|
|
.getMethod()
|
|
|
|
implementation.replaceInstruction(
|
|
instructionIndex,
|
|
"invoke-static {}, ${allCodecsMethod.definingClass}->${allCodecsMethod.name}()Ljava/util/Set;".toInstruction()
|
|
)
|
|
|
|
return PatchResultSuccess()
|
|
}
|
|
}
|