Sonic.smali
.class final Lcom/google/android/exoplayer2/audio/Sonic;
.super Ljava/lang/Object;
.source "Sonic.java"
# static fields
.field private static final AMDF_FREQUENCY:I
.field private static final MAXIMUM_PITCH:I
.field private static final MINIMUM_PITCH:I
# instance fields
.field private final channelCount:I
.field private final downSampleBuffer:[S
.field private inputBuffer:[S
.field private inputFrameCount:I
.field private final inputSampleRateHz:I
.field private maxDiff:I
.field private final maxPeriod:I
.field private final maxRequiredFrameCount:I
.field private minDiff:I
.field private final minPeriod:I
.field private newRatePosition:I
.field private oldRatePosition:I
.field private outputBuffer:[S
.field private outputFrameCount:I
.field private final pitch:F
.field private pitchBuffer:[S
.field private pitchFrameCount:I
.field private prevMinDiff:I
.field private prevPeriod:I
.field private final rate:F
.field private remainingInputToCopyFrameCount:I
.field private final speed:F
# direct methods
.method static constructor <clinit>()V
.registers 1
const v0, 0x1acf
invoke-static {v0}, Lnp/NPFog;->d(I)I
move-result v0
sput v0, Lcom/google/android/exoplayer2/audio/Sonic;->AMDF_FREQUENCY:I
const v0, 0x14ff
invoke-static {v0}, Lnp/NPFog;->d(I)I
move-result v0
sput v0, Lcom/google/android/exoplayer2/audio/Sonic;->MAXIMUM_PITCH:I
const v0, 0x152e
invoke-static {v0}, Lnp/NPFog;->d(I)I
move-result v0
sput v0, Lcom/google/android/exoplayer2/audio/Sonic;->MINIMUM_PITCH:I
return-void
.end method
.method public constructor <init>(IIFFI)V
.registers 8
.param p1, "inputSampleRateHz" # I
.param p2, "channelCount" # I
.param p3, "speed" # F
.param p4, "pitch" # F
.param p5, "outputSampleRateHz" # I
.line 68
invoke-direct {p0}, Ljava/lang/Object;-><init>()V
.line 69
iput p1, p0, Lcom/google/android/exoplayer2/audio/Sonic;->inputSampleRateHz:I
.line 70
iput p2, p0, Lcom/google/android/exoplayer2/audio/Sonic;->channelCount:I
.line 71
iput p3, p0, Lcom/google/android/exoplayer2/audio/Sonic;->speed:F
.line 72
iput p4, p0, Lcom/google/android/exoplayer2/audio/Sonic;->pitch:F
.line 73
int-to-float v0, p1
int-to-float v1, p5
div-float/2addr v0, v1
iput v0, p0, Lcom/google/android/exoplayer2/audio/Sonic;->rate:F
.line 74
div-int/lit16 v0, p1, 0x190
iput v0, p0, Lcom/google/android/exoplayer2/audio/Sonic;->minPeriod:I
.line 75
div-int/lit8 v0, p1, 0x41
iput v0, p0, Lcom/google/android/exoplayer2/audio/Sonic;->maxPeriod:I
.line 76
mul-int/lit8 v0, v0, 0x2
iput v0, p0, Lcom/google/android/exoplayer2/audio/Sonic;->maxRequiredFrameCount:I
.line 77
new-array v1, v0, [S
iput-object v1, p0, Lcom/google/android/exoplayer2/audio/Sonic;->downSampleBuffer:[S
.line 78
mul-int v1, v0, p2
new-array v1, v1, [S
iput-object v1, p0, Lcom/google/android/exoplayer2/audio/Sonic;->inputBuffer:[S
.line 79
mul-int v1, v0, p2
new-array v1, v1, [S
iput-object v1, p0, Lcom/google/android/exoplayer2/audio/Sonic;->outputBuffer:[S
.line 80
mul-int v0, v0, p2
new-array v0, v0, [S
iput-object v0, p0, Lcom/google/android/exoplayer2/audio/Sonic;->pitchBuffer:[S
.line 81
return-void
.end method
.method private adjustRate(FI)V
.registers 12
.param p1, "rate" # F
.param p2, "originalOutputFrameCount" # I
.line 359
iget v0, p0, Lcom/google/android/exoplayer2/audio/Sonic;->outputFrameCount:I
if-ne v0, p2, :cond_5
.line 360
return-void
.line 362
:cond_5
iget v0, p0, Lcom/google/android/exoplayer2/audio/Sonic;->inputSampleRateHz:I
int-to-float v0, v0
div-float/2addr v0, p1
float-to-int v0, v0
.line 363
.local v0, "newSampleRate":I
iget v1, p0, Lcom/google/android/exoplayer2/audio/Sonic;->inputSampleRateHz:I
.line 365
.local v1, "oldSampleRate":I
:goto_c
const/16 v2, 0x4000
if-gt v0, v2, :cond_73
if-le v1, v2, :cond_13
goto :goto_73
.line 369
:cond_13
invoke-direct {p0, p2}, Lcom/google/android/exoplayer2/audio/Sonic;->moveNewSamplesToPitchBuffer(I)V
.line 371
const/4 v2, 0x0
.local v2, "position":I
:goto_17
iget v3, p0, Lcom/google/android/exoplayer2/audio/Sonic;->pitchFrameCount:I
add-int/lit8 v4, v3, -0x1
const/4 v5, 0x1
if-ge v2, v4, :cond_6e
.line 372
:goto_1e
iget v3, p0, Lcom/google/android/exoplayer2/audio/Sonic;->oldRatePosition:I
add-int/lit8 v4, v3, 0x1
mul-int v4, v4, v0
iget v6, p0, Lcom/google/android/exoplayer2/audio/Sonic;->newRatePosition:I
mul-int v7, v6, v1
if-le v4, v7, :cond_59
.line 373
iget-object v3, p0, Lcom/google/android/exoplayer2/audio/Sonic;->outputBuffer:[S
iget v4, p0, Lcom/google/android/exoplayer2/audio/Sonic;->outputFrameCount:I
.line 374
invoke-direct {p0, v3, v4, v5}, Lcom/google/android/exoplayer2/audio/Sonic;->ensureSpaceForAdditionalFrames([SII)[S
move-result-object v3
iput-object v3, p0, Lcom/google/android/exoplayer2/audio/Sonic;->outputBuffer:[S
.line 376
const/4 v3, 0x0
.local v3, "i":I
:goto_35
iget v4, p0, Lcom/google/android/exoplayer2/audio/Sonic;->channelCount:I
if-ge v3, v4, :cond_4e
.line 377
iget-object v6, p0, Lcom/google/android/exoplayer2/audio/Sonic;->outputBuffer:[S
iget v7, p0, Lcom/google/android/exoplayer2/audio/Sonic;->outputFrameCount:I
mul-int v7, v7, v4
add-int/2addr v7, v3
iget-object v8, p0, Lcom/google/android/exoplayer2/audio/Sonic;->pitchBuffer:[S
mul-int v4, v4, v2
add-int/2addr v4, v3
.line 378
invoke-direct {p0, v8, v4, v1, v0}, Lcom/google/android/exoplayer2/audio/Sonic;->interpolate([SIII)S
move-result v4
aput-short v4, v6, v7
.line 376
add-int/lit8 v3, v3, 0x1
goto :goto_35
.line 380
.end local v3 # "i":I
:cond_4e
iget v3, p0, Lcom/google/android/exoplayer2/audio/Sonic;->newRatePosition:I
add-int/2addr v3, v5
iput v3, p0, Lcom/google/android/exoplayer2/audio/Sonic;->newRatePosition:I
.line 381
iget v3, p0, Lcom/google/android/exoplayer2/audio/Sonic;->outputFrameCount:I
add-int/2addr v3, v5
iput v3, p0, Lcom/google/android/exoplayer2/audio/Sonic;->outputFrameCount:I
goto :goto_1e
.line 383
:cond_59
add-int/lit8 v3, v3, 0x1
iput v3, p0, Lcom/google/android/exoplayer2/audio/Sonic;->oldRatePosition:I
.line 384
if-ne v3, v1, :cond_6b
.line 385
const/4 v3, 0x0
iput v3, p0, Lcom/google/android/exoplayer2/audio/Sonic;->oldRatePosition:I
.line 386
if-ne v6, v0, :cond_65
goto :goto_66
:cond_65
const/4 v5, 0x0
:goto_66
invoke-static {v5}, Lcom/google/android/exoplayer2/util/Assertions;->checkState(Z)V
.line 387
iput v3, p0, Lcom/google/android/exoplayer2/audio/Sonic;->newRatePosition:I
.line 371
:cond_6b
add-int/lit8 v2, v2, 0x1
goto :goto_17
.line 390
.end local v2 # "position":I
:cond_6e
sub-int/2addr v3, v5
invoke-direct {p0, v3}, Lcom/google/android/exoplayer2/audio/Sonic;->removePitchFrames(I)V
.line 391
return-void
.line 366
:cond_73
:goto_73
div-int/lit8 v0, v0, 0x2
.line 367
div-int/lit8 v1, v1, 0x2
goto :goto_c
.end method
.method private changeSpeed(F)V
.registers 10
.param p1, "speed" # F
.line 447
iget v0, p0, Lcom/google/android/exoplayer2/audio/Sonic;->inputFrameCount:I
iget v1, p0, Lcom/google/android/exoplayer2/audio/Sonic;->maxRequiredFrameCount:I
if-ge v0, v1, :cond_7
.line 448
return-void
.line 450
:cond_7
iget v0, p0, Lcom/google/android/exoplayer2/audio/Sonic;->inputFrameCount:I
.line 451
.local v0, "frameCount":I
const/4 v1, 0x0
.line 453
.local v1, "positionFrames":I
:goto_a
iget v2, p0, Lcom/google/android/exoplayer2/audio/Sonic;->remainingInputToCopyFrameCount:I
if-lez v2, :cond_14
.line 454
invoke-direct {p0, v1}, Lcom/google/android/exoplayer2/audio/Sonic;->copyInputToOutput(I)I
move-result v2
add-int/2addr v1, v2
goto :goto_31
.line 456
:cond_14
iget-object v2, p0, Lcom/google/android/exoplayer2/audio/Sonic;->inputBuffer:[S
invoke-direct {p0, v2, v1}, Lcom/google/android/exoplayer2/audio/Sonic;->findPitchPeriod([SI)I
move-result v2
.line 457
.local v2, "period":I
float-to-double v3, p1
const-wide/high16 v5, 0x3ff0000000000000L # 1.0
cmpl-double v7, v3, v5
if-lez v7, :cond_2a
.line 458
iget-object v3, p0, Lcom/google/android/exoplayer2/audio/Sonic;->inputBuffer:[S
invoke-direct {p0, v3, v1, p1, v2}, Lcom/google/android/exoplayer2/audio/Sonic;->skipPitchPeriod([SIFI)I
move-result v3
add-int/2addr v3, v2
add-int/2addr v1, v3
goto :goto_31
.line 460
:cond_2a
iget-object v3, p0, Lcom/google/android/exoplayer2/audio/Sonic;->inputBuffer:[S
invoke-direct {p0, v3, v1, p1, v2}, Lcom/google/android/exoplayer2/audio/Sonic;->insertPitchPeriod([SIFI)I
move-result v3
add-int/2addr v1, v3
.line 463
.end local v2 # "period":I
:goto_31
iget v2, p0, Lcom/google/android/exoplayer2/audio/Sonic;->maxRequiredFrameCount:I
add-int/2addr v2, v1
if-le v2, v0, :cond_3a
.line 464
invoke-direct {p0, v1}, Lcom/google/android/exoplayer2/audio/Sonic;->removeProcessedInputFrames(I)V
.line 465
return-void
.line 463
:cond_3a
goto :goto_a
.end method
.method private copyInputToOutput(I)I
.registers 4
.param p1, "positionFrames" # I
.line 207
iget v0, p0, Lcom/google/android/exoplayer2/audio/Sonic;->maxRequiredFrameCount:I
iget v1, p0, Lcom/google/android/exoplayer2/audio/Sonic;->remainingInputToCopyFrameCount:I
invoke-static {v0, v1}, Ljava/lang/Math;->min(II)I
move-result v0
.line 208
.local v0, "frameCount":I
iget-object v1, p0, Lcom/google/android/exoplayer2/audio/Sonic;->inputBuffer:[S
invoke-direct {p0, v1, p1, v0}, Lcom/google/android/exoplayer2/audio/Sonic;->copyToOutput([SII)V
.line 209
iget v1, p0, Lcom/google/android/exoplayer2/audio/Sonic;->remainingInputToCopyFrameCount:I
sub-int/2addr v1, v0
iput v1, p0, Lcom/google/android/exoplayer2/audio/Sonic;->remainingInputToCopyFrameCount:I
.line 210
return v0
.end method
.method private copyToOutput([SII)V
.registers 8
.param p1, "samples" # [S
.param p2, "positionFrames" # I
.param p3, "frameCount" # I
.line 196
iget-object v0, p0, Lcom/google/android/exoplayer2/audio/Sonic;->outputBuffer:[S
iget v1, p0, Lcom/google/android/exoplayer2/audio/Sonic;->outputFrameCount:I
invoke-direct {p0, v0, v1, p3}, Lcom/google/android/exoplayer2/audio/Sonic;->ensureSpaceForAdditionalFrames([SII)[S
move-result-object v0
iput-object v0, p0, Lcom/google/android/exoplayer2/audio/Sonic;->outputBuffer:[S
.line 197
iget v1, p0, Lcom/google/android/exoplayer2/audio/Sonic;->channelCount:I
mul-int v2, p2, v1
iget v3, p0, Lcom/google/android/exoplayer2/audio/Sonic;->outputFrameCount:I
mul-int v3, v3, v1
mul-int v1, v1, p3
invoke-static {p1, v2, v0, v3, v1}, Ljava/lang/System;->arraycopy(Ljava/lang/Object;ILjava/lang/Object;II)V
.line 203
iget v0, p0, Lcom/google/android/exoplayer2/audio/Sonic;->outputFrameCount:I
add-int/2addr v0, p3
iput v0, p0, Lcom/google/android/exoplayer2/audio/Sonic;->outputFrameCount:I
.line 204
return-void
.end method
.method private downSampleInput([SII)V
.registers 10
.param p1, "samples" # [S
.param p2, "position" # I
.param p3, "skip" # I
.line 216
iget v0, p0, Lcom/google/android/exoplayer2/audio/Sonic;->maxRequiredFrameCount:I
div-int/2addr v0, p3
.line 217
.local v0, "frameCount":I
iget v1, p0, Lcom/google/android/exoplayer2/audio/Sonic;->channelCount:I
mul-int v2, v1, p3
.line 218
.local v2, "samplesPerValue":I
mul-int p2, p2, v1
.line 219
const/4 v1, 0x0
.local v1, "i":I
:goto_a
if-ge v1, v0, :cond_23
.line 220
const/4 v3, 0x0
.line 221
.local v3, "value":I
const/4 v4, 0x0
.local v4, "j":I
:goto_e
if-ge v4, v2, :cond_1a
.line 222
mul-int v5, v1, v2
add-int/2addr v5, p2
add-int/2addr v5, v4
aget-short v5, p1, v5
add-int/2addr v3, v5
.line 221
add-int/lit8 v4, v4, 0x1
goto :goto_e
.line 224
.end local v4 # "j":I
:cond_1a
div-int/2addr v3, v2
.line 225
iget-object v4, p0, Lcom/google/android/exoplayer2/audio/Sonic;->downSampleBuffer:[S
int-to-short v5, v3
aput-short v5, v4, v1
.line 219
.end local v3 # "value":I
add-int/lit8 v1, v1, 0x1
goto :goto_a
.line 227
.end local v1 # "i":I
:cond_23
return-void
.end method
.method private ensureSpaceForAdditionalFrames([SII)[S
.registers 7
.param p1, "buffer" # [S
.param p2, "frameCount" # I
.param p3, "additionalFrameCount" # I
.line 179
array-length v0, p1
iget v1, p0, Lcom/google/android/exoplayer2/audio/Sonic;->channelCount:I
div-int/2addr v0, v1
.line 180
.local v0, "currentCapacityFrames":I
add-int v2, p2, p3
if-gt v2, v0, :cond_9
.line 181
return-object p1
.line 183
:cond_9
mul-int/lit8 v2, v0, 0x3
div-int/lit8 v2, v2, 0x2
add-int/2addr v2, p3
.line 184
.local v2, "newCapacityFrames":I
mul-int v1, v1, v2
invoke-static {p1, v1}, Ljava/util/Arrays;->copyOf([SI)[S
move-result-object v1
return-object v1
.end method
.method private findPitchPeriod([SI)I
.registers 10
.param p1, "samples" # [S
.param p2, "position" # I
.line 287
iget v0, p0, Lcom/google/android/exoplayer2/audio/Sonic;->inputSampleRateHz:I
const/16 v1, 0xfa0
const/4 v2, 0x1
if-le v0, v1, :cond_9
div-int/2addr v0, v1
goto :goto_a
:cond_9
const/4 v0, 0x1
.line 288
.local v0, "skip":I
:goto_a
iget v1, p0, Lcom/google/android/exoplayer2/audio/Sonic;->channelCount:I
if-ne v1, v2, :cond_19
if-ne v0, v2, :cond_19
.line 289
iget v1, p0, Lcom/google/android/exoplayer2/audio/Sonic;->minPeriod:I
iget v2, p0, Lcom/google/android/exoplayer2/audio/Sonic;->maxPeriod:I
invoke-direct {p0, p1, p2, v1, v2}, Lcom/google/android/exoplayer2/audio/Sonic;->findPitchPeriodInRange([SIII)I
move-result v1
.local v1, "period":I
goto :goto_52
.line 291
.end local v1 # "period":I
:cond_19
invoke-direct {p0, p1, p2, v0}, Lcom/google/android/exoplayer2/audio/Sonic;->downSampleInput([SII)V
.line 292
iget-object v1, p0, Lcom/google/android/exoplayer2/audio/Sonic;->downSampleBuffer:[S
iget v3, p0, Lcom/google/android/exoplayer2/audio/Sonic;->minPeriod:I
div-int/2addr v3, v0
iget v4, p0, Lcom/google/android/exoplayer2/audio/Sonic;->maxPeriod:I
div-int/2addr v4, v0
const/4 v5, 0x0
invoke-direct {p0, v1, v5, v3, v4}, Lcom/google/android/exoplayer2/audio/Sonic;->findPitchPeriodInRange([SIII)I
move-result v1
.line 293
.restart local v1 # "period":I
if-eq v0, v2, :cond_52
.line 294
mul-int v1, v1, v0
.line 295
mul-int/lit8 v3, v0, 0x4
sub-int v3, v1, v3
.line 296
.local v3, "minP":I
mul-int/lit8 v4, v0, 0x4
add-int/2addr v4, v1
.line 297
.local v4, "maxP":I
iget v6, p0, Lcom/google/android/exoplayer2/audio/Sonic;->minPeriod:I
if-ge v3, v6, :cond_3a
.line 298
iget v3, p0, Lcom/google/android/exoplayer2/audio/Sonic;->minPeriod:I
.line 300
:cond_3a
iget v6, p0, Lcom/google/android/exoplayer2/audio/Sonic;->maxPeriod:I
if-le v4, v6, :cond_40
.line 301
iget v4, p0, Lcom/google/android/exoplayer2/audio/Sonic;->maxPeriod:I
.line 303
:cond_40
iget v6, p0, Lcom/google/android/exoplayer2/audio/Sonic;->channelCount:I
if-ne v6, v2, :cond_49
.line 304
invoke-direct {p0, p1, p2, v3, v4}, Lcom/google/android/exoplayer2/audio/Sonic;->findPitchPeriodInRange([SIII)I
move-result v1
goto :goto_52
.line 306
:cond_49
invoke-direct {p0, p1, p2, v2}, Lcom/google/android/exoplayer2/audio/Sonic;->downSampleInput([SII)V
.line 307
iget-object v2, p0, Lcom/google/android/exoplayer2/audio/Sonic;->downSampleBuffer:[S
invoke-direct {p0, v2, v5, v3, v4}, Lcom/google/android/exoplayer2/audio/Sonic;->findPitchPeriodInRange([SIII)I
move-result v1
.line 311
.end local v3 # "minP":I
.end local v4 # "maxP":I
:cond_52
:goto_52
iget v2, p0, Lcom/google/android/exoplayer2/audio/Sonic;->minDiff:I
iget v3, p0, Lcom/google/android/exoplayer2/audio/Sonic;->maxDiff:I
invoke-direct {p0, v2, v3}, Lcom/google/android/exoplayer2/audio/Sonic;->previousPeriodBetter(II)Z
move-result v2
if-eqz v2, :cond_5f
.line 312
iget v2, p0, Lcom/google/android/exoplayer2/audio/Sonic;->prevPeriod:I
.local v2, "retPeriod":I
goto :goto_60
.line 314
.end local v2 # "retPeriod":I
:cond_5f
move v2, v1
.line 316
.restart local v2 # "retPeriod":I
:goto_60
iget v3, p0, Lcom/google/android/exoplayer2/audio/Sonic;->minDiff:I
iput v3, p0, Lcom/google/android/exoplayer2/audio/Sonic;->prevMinDiff:I
.line 317
iput v1, p0, Lcom/google/android/exoplayer2/audio/Sonic;->prevPeriod:I
.line 318
return v2
.end method
.method private findPitchPeriodInRange([SIII)I
.registers 15
.param p1, "samples" # [S
.param p2, "position" # I
.param p3, "minPeriod" # I
.param p4, "maxPeriod" # I
.line 232
const/4 v0, 0x0
.line 233
.local v0, "bestPeriod":I
const/16 v1, 0xff
.line 234
.local v1, "worstPeriod":I
const/4 v2, 0x1
.line 235
.local v2, "minDiff":I
const/4 v3, 0x0
.line 236
.local v3, "maxDiff":I
iget v4, p0, Lcom/google/android/exoplayer2/audio/Sonic;->channelCount:I
mul-int p2, p2, v4
.line 237
move v4, p3
.local v4, "period":I
:goto_a
if-gt v4, p4, :cond_36
.line 238
const/4 v5, 0x0
.line 239
.local v5, "diff":I
const/4 v6, 0x0
.local v6, "i":I
:goto_e
if-ge v6, v4, :cond_23
.line 240
add-int v7, p2, v6
aget-short v7, p1, v7
.line 241
.local v7, "sVal":S
add-int v8, p2, v4
add-int/2addr v8, v6
aget-short v8, p1, v8
.line 242
.local v8, "pVal":S
sub-int v9, v7, v8
invoke-static {v9}, Ljava/lang/Math;->abs(I)I
move-result v9
add-int/2addr v5, v9
.line 239
.end local v7 # "sVal":S
.end local v8 # "pVal":S
add-int/lit8 v6, v6, 0x1
goto :goto_e
.line 247
.end local v6 # "i":I
:cond_23
mul-int v6, v5, v0
mul-int v7, v2, v4
if-ge v6, v7, :cond_2b
.line 248
move v2, v5
.line 249
move v0, v4
.line 251
:cond_2b
mul-int v6, v5, v1
mul-int v7, v3, v4
if-le v6, v7, :cond_33
.line 252
move v3, v5
.line 253
move v1, v4
.line 237
.end local v5 # "diff":I
:cond_33
add-int/lit8 v4, v4, 0x1
goto :goto_a
.line 256
.end local v4 # "period":I
:cond_36
div-int v4, v2, v0
iput v4, p0, Lcom/google/android/exoplayer2/audio/Sonic;->minDiff:I
.line 257
div-int v4, v3, v1
iput v4, p0, Lcom/google/android/exoplayer2/audio/Sonic;->maxDiff:I
.line 258
return v0
.end method
.method private insertPitchPeriod([SIFI)I
.registers 15
.param p1, "samples" # [S
.param p2, "position" # I
.param p3, "speed" # F
.param p4, "period" # I
.line 419
const/high16 v0, 0x3f800000 # 1.0f
const/high16 v1, 0x3f000000 # 0.5f
cmpg-float v1, p3, v1
if-gez v1, :cond_f
.line 420
int-to-float v1, p4
mul-float v1, v1, p3
sub-float/2addr v0, p3
div-float/2addr v1, v0
float-to-int v0, v1
.local v0, "newFrameCount":I
goto :goto_1e
.line 422
.end local v0 # "newFrameCount":I
:cond_f
move v1, p4
.line 423
.local v1, "newFrameCount":I
int-to-float v2, p4
const/high16 v3, 0x40000000 # 2.0f
mul-float v3, v3, p3
sub-float/2addr v3, v0
mul-float v2, v2, v3
sub-float/2addr v0, p3
div-float/2addr v2, v0
float-to-int v0, v2
iput v0, p0, Lcom/google/android/exoplayer2/audio/Sonic;->remainingInputToCopyFrameCount:I
move v0, v1
.line 425
.end local v1 # "newFrameCount":I
.restart local v0 # "newFrameCount":I
:goto_1e
iget-object v1, p0, Lcom/google/android/exoplayer2/audio/Sonic;->outputBuffer:[S
iget v2, p0, Lcom/google/android/exoplayer2/audio/Sonic;->outputFrameCount:I
add-int v3, p4, v0
.line 426
invoke-direct {p0, v1, v2, v3}, Lcom/google/android/exoplayer2/audio/Sonic;->ensureSpaceForAdditionalFrames([SII)[S
move-result-object v1
iput-object v1, p0, Lcom/google/android/exoplayer2/audio/Sonic;->outputBuffer:[S
.line 427
iget v2, p0, Lcom/google/android/exoplayer2/audio/Sonic;->channelCount:I
mul-int v3, p2, v2
iget v4, p0, Lcom/google/android/exoplayer2/audio/Sonic;->outputFrameCount:I
mul-int v4, v4, v2
mul-int v2, v2, p4
invoke-static {p1, v3, v1, v4, v2}, Ljava/lang/System;->arraycopy(Ljava/lang/Object;ILjava/lang/Object;II)V
.line 433
iget v3, p0, Lcom/google/android/exoplayer2/audio/Sonic;->channelCount:I
iget-object v4, p0, Lcom/google/android/exoplayer2/audio/Sonic;->outputBuffer:[S
iget v1, p0, Lcom/google/android/exoplayer2/audio/Sonic;->outputFrameCount:I
add-int v5, v1, p4
add-int v7, p2, p4
move v2, v0
move-object v6, p1
move-object v8, p1
move v9, p2
invoke-static/range {v2 .. v9}, Lcom/google/android/exoplayer2/audio/Sonic;->overlapAdd(II[SI[SI[SI)V
.line 442
iget v1, p0, Lcom/google/android/exoplayer2/audio/Sonic;->outputFrameCount:I
add-int v2, p4, v0
add-int/2addr v1, v2
iput v1, p0, Lcom/google/android/exoplayer2/audio/Sonic;->outputFrameCount:I
.line 443
return v0
.end method
.method private interpolate([SIII)S
.registers 14
.param p1, "in" # [S
.param p2, "inPos" # I
.param p3, "oldSampleRate" # I
.param p4, "newSampleRate" # I
.line 348
aget-short v0, p1, p2
.line 349
.local v0, "left":S
iget v1, p0, Lcom/google/android/exoplayer2/audio/Sonic;->channelCount:I
add-int/2addr v1, p2
aget-short v1, p1, v1
.line 350
.local v1, "right":S
iget v2, p0, Lcom/google/android/exoplayer2/audio/Sonic;->newRatePosition:I
mul-int v2, v2, p3
.line 351
.local v2, "position":I
iget v3, p0, Lcom/google/android/exoplayer2/audio/Sonic;->oldRatePosition:I
mul-int v4, v3, p4
.line 352
.local v4, "leftPosition":I
add-int/lit8 v3, v3, 0x1
mul-int v3, v3, p4
.line 353
.local v3, "rightPosition":I
sub-int v5, v3, v2
.line 354
.local v5, "ratio":I
sub-int v6, v3, v4
.line 355
.local v6, "width":I
mul-int v7, v5, v0
sub-int v8, v6, v5
mul-int v8, v8, v1
add-int/2addr v7, v8
div-int/2addr v7, v6
int-to-short v7, v7
return v7
.end method
.method private moveNewSamplesToPitchBuffer(I)V
.registers 8
.param p1, "originalOutputFrameCount" # I
.line 322
iget v0, p0, Lcom/google/android/exoplayer2/audio/Sonic;->outputFrameCount:I
sub-int/2addr v0, p1
.line 323
.local v0, "frameCount":I
iget-object v1, p0, Lcom/google/android/exoplayer2/audio/Sonic;->pitchBuffer:[S
iget v2, p0, Lcom/google/android/exoplayer2/audio/Sonic;->pitchFrameCount:I
invoke-direct {p0, v1, v2, v0}, Lcom/google/android/exoplayer2/audio/Sonic;->ensureSpaceForAdditionalFrames([SII)[S
move-result-object v1
iput-object v1, p0, Lcom/google/android/exoplayer2/audio/Sonic;->pitchBuffer:[S
.line 324
iget-object v2, p0, Lcom/google/android/exoplayer2/audio/Sonic;->outputBuffer:[S
iget v3, p0, Lcom/google/android/exoplayer2/audio/Sonic;->channelCount:I
mul-int v4, p1, v3
iget v5, p0, Lcom/google/android/exoplayer2/audio/Sonic;->pitchFrameCount:I
mul-int v5, v5, v3
mul-int v3, v3, v0
invoke-static {v2, v4, v1, v5, v3}, Ljava/lang/System;->arraycopy(Ljava/lang/Object;ILjava/lang/Object;II)V
.line 330
iput p1, p0, Lcom/google/android/exoplayer2/audio/Sonic;->outputFrameCount:I
.line 331
iget v1, p0, Lcom/google/android/exoplayer2/audio/Sonic;->pitchFrameCount:I
add-int/2addr v1, v0
iput v1, p0, Lcom/google/android/exoplayer2/audio/Sonic;->pitchFrameCount:I
.line 332
return-void
.end method
.method private static overlapAdd(II[SI[SI[SI)V
.registers 15
.param p0, "frameCount" # I
.param p1, "channelCount" # I
.param p2, "out" # [S
.param p3, "outPosition" # I
.param p4, "rampDown" # [S
.param p5, "rampDownPosition" # I
.param p6, "rampUp" # [S
.param p7, "rampUpPosition" # I
.line 492
const/4 v0, 0x0
.local v0, "i":I
:goto_1
if-ge v0, p1, :cond_27
.line 493
mul-int v1, p3, p1
add-int/2addr v1, v0
.line 494
.local v1, "o":I
mul-int v2, p7, p1
add-int/2addr v2, v0
.line 495
.local v2, "u":I
mul-int v3, p5, p1
add-int/2addr v3, v0
.line 496
.local v3, "d":I
const/4 v4, 0x0
.local v4, "t":I
:goto_d
if-ge v4, p0, :cond_24
.line 497
aget-short v5, p4, v3
sub-int v6, p0, v4
mul-int v5, v5, v6
aget-short v6, p6, v2
mul-int v6, v6, v4
add-int/2addr v5, v6
div-int/2addr v5, p0
int-to-short v5, v5
aput-short v5, p2, v1
.line 498
add-int/2addr v1, p1
.line 499
add-int/2addr v3, p1
.line 500
add-int/2addr v2, p1
.line 496
add-int/lit8 v4, v4, 0x1
goto :goto_d
.line 492
.end local v1 # "o":I
.end local v2 # "u":I
.end local v3 # "d":I
.end local v4 # "t":I
:cond_24
add-int/lit8 v0, v0, 0x1
goto :goto_1
.line 503
.end local v0 # "i":I
:cond_27
return-void
.end method
.method private previousPeriodBetter(II)Z
.registers 6
.param p1, "minDiff" # I
.param p2, "maxDiff" # I
.line 266
const/4 v0, 0x0
if-eqz p1, :cond_18
iget v1, p0, Lcom/google/android/exoplayer2/audio/Sonic;->prevPeriod:I
if-nez v1, :cond_8
goto :goto_18
.line 269
:cond_8
mul-int/lit8 v1, p1, 0x3
if-le p2, v1, :cond_d
.line 271
return v0
.line 273
:cond_d
mul-int/lit8 v1, p1, 0x2
iget v2, p0, Lcom/google/android/exoplayer2/audio/Sonic;->prevMinDiff:I
mul-int/lit8 v2, v2, 0x3
if-gt v1, v2, :cond_16
.line 275
return v0
.line 277
:cond_16
const/4 v0, 0x1
return v0
.line 267
:cond_18
:goto_18
return v0
.end method
.method private processStreamInput()V
.registers 9
.line 469
iget v0, p0, Lcom/google/android/exoplayer2/audio/Sonic;->outputFrameCount:I
.line 470
.local v0, "originalOutputFrameCount":I
iget v1, p0, Lcom/google/android/exoplayer2/audio/Sonic;->speed:F
iget v2, p0, Lcom/google/android/exoplayer2/audio/Sonic;->pitch:F
div-float/2addr v1, v2
.line 471
.local v1, "s":F
iget v3, p0, Lcom/google/android/exoplayer2/audio/Sonic;->rate:F
mul-float v3, v3, v2
.line 472
.local v3, "r":F
float-to-double v4, v1
const-wide v6, 0x3ff0000a7c5ac472L # 1.00001
cmpl-double v2, v4, v6
if-gtz v2, :cond_2b
float-to-double v4, v1
const-wide v6, 0x3fefffeb074a771dL # 0.99999
cmpg-double v2, v4, v6
if-gez v2, :cond_20
goto :goto_2b
.line 475
:cond_20
iget-object v2, p0, Lcom/google/android/exoplayer2/audio/Sonic;->inputBuffer:[S
iget v4, p0, Lcom/google/android/exoplayer2/audio/Sonic;->inputFrameCount:I
const/4 v5, 0x0
invoke-direct {p0, v2, v5, v4}, Lcom/google/android/exoplayer2/audio/Sonic;->copyToOutput([SII)V
.line 476
iput v5, p0, Lcom/google/android/exoplayer2/audio/Sonic;->inputFrameCount:I
goto :goto_2e
.line 473
:cond_2b
:goto_2b
invoke-direct {p0, v1}, Lcom/google/android/exoplayer2/audio/Sonic;->changeSpeed(F)V
.line 478
:goto_2e
const/high16 v2, 0x3f800000 # 1.0f
cmpl-float v2, v3, v2
if-eqz v2, :cond_37
.line 479
invoke-direct {p0, v3, v0}, Lcom/google/android/exoplayer2/audio/Sonic;->adjustRate(FI)V
.line 481
:cond_37
return-void
.end method
.method private removePitchFrames(I)V
.registers 7
.param p1, "frameCount" # I
.line 335
if-nez p1, :cond_3
.line 336
return-void
.line 338
:cond_3
iget-object v0, p0, Lcom/google/android/exoplayer2/audio/Sonic;->pitchBuffer:[S
iget v1, p0, Lcom/google/android/exoplayer2/audio/Sonic;->channelCount:I
mul-int v2, p1, v1
const/4 v3, 0x0
iget v4, p0, Lcom/google/android/exoplayer2/audio/Sonic;->pitchFrameCount:I
sub-int/2addr v4, p1
mul-int v4, v4, v1
invoke-static {v0, v2, v0, v3, v4}, Ljava/lang/System;->arraycopy(Ljava/lang/Object;ILjava/lang/Object;II)V
.line 344
iget v0, p0, Lcom/google/android/exoplayer2/audio/Sonic;->pitchFrameCount:I
sub-int/2addr v0, p1
iput v0, p0, Lcom/google/android/exoplayer2/audio/Sonic;->pitchFrameCount:I
.line 345
return-void
.end method
.method private removeProcessedInputFrames(I)V
.registers 7
.param p1, "positionFrames" # I
.line 189
iget v0, p0, Lcom/google/android/exoplayer2/audio/Sonic;->inputFrameCount:I
sub-int/2addr v0, p1
.line 190
.local v0, "remainingFrames":I
iget-object v1, p0, Lcom/google/android/exoplayer2/audio/Sonic;->inputBuffer:[S
iget v2, p0, Lcom/google/android/exoplayer2/audio/Sonic;->channelCount:I
mul-int v3, p1, v2
mul-int v2, v2, v0
const/4 v4, 0x0
invoke-static {v1, v3, v1, v4, v2}, Ljava/lang/System;->arraycopy(Ljava/lang/Object;ILjava/lang/Object;II)V
.line 192
iput v0, p0, Lcom/google/android/exoplayer2/audio/Sonic;->inputFrameCount:I
.line 193
return-void
.end method
.method private skipPitchPeriod([SIFI)I
.registers 16
.param p1, "samples" # [S
.param p2, "position" # I
.param p3, "speed" # F
.param p4, "period" # I
.line 396
const/high16 v0, 0x3f800000 # 1.0f
const/high16 v1, 0x40000000 # 2.0f
cmpl-float v2, p3, v1
if-ltz v2, :cond_e
.line 397
int-to-float v1, p4
sub-float v0, p3, v0
div-float/2addr v1, v0
float-to-int v0, v1
.local v0, "newFrameCount":I
goto :goto_1a
.line 399
.end local v0 # "newFrameCount":I
:cond_e
move v2, p4
.line 400
.local v2, "newFrameCount":I
int-to-float v3, p4
sub-float/2addr v1, p3
mul-float v3, v3, v1
sub-float v0, p3, v0
div-float/2addr v3, v0
float-to-int v0, v3
iput v0, p0, Lcom/google/android/exoplayer2/audio/Sonic;->remainingInputToCopyFrameCount:I
move v0, v2
.line 402
.end local v2 # "newFrameCount":I
.restart local v0 # "newFrameCount":I
:goto_1a
iget-object v1, p0, Lcom/google/android/exoplayer2/audio/Sonic;->outputBuffer:[S
iget v2, p0, Lcom/google/android/exoplayer2/audio/Sonic;->outputFrameCount:I
invoke-direct {p0, v1, v2, v0}, Lcom/google/android/exoplayer2/audio/Sonic;->ensureSpaceForAdditionalFrames([SII)[S
move-result-object v5
iput-object v5, p0, Lcom/google/android/exoplayer2/audio/Sonic;->outputBuffer:[S
.line 403
iget v4, p0, Lcom/google/android/exoplayer2/audio/Sonic;->channelCount:I
iget v6, p0, Lcom/google/android/exoplayer2/audio/Sonic;->outputFrameCount:I
add-int v10, p2, p4
move v3, v0
move-object v7, p1
move v8, p2
move-object v9, p1
invoke-static/range {v3 .. v10}, Lcom/google/android/exoplayer2/audio/Sonic;->overlapAdd(II[SI[SI[SI)V
.line 412
iget v1, p0, Lcom/google/android/exoplayer2/audio/Sonic;->outputFrameCount:I
add-int/2addr v1, v0
iput v1, p0, Lcom/google/android/exoplayer2/audio/Sonic;->outputFrameCount:I
.line 413
return v0
.end method
# virtual methods
.method public flush()V
.registers 2
.line 148
const/4 v0, 0x0
iput v0, p0, Lcom/google/android/exoplayer2/audio/Sonic;->inputFrameCount:I
.line 149
iput v0, p0, Lcom/google/android/exoplayer2/audio/Sonic;->outputFrameCount:I
.line 150
iput v0, p0, Lcom/google/android/exoplayer2/audio/Sonic;->pitchFrameCount:I
.line 151
iput v0, p0, Lcom/google/android/exoplayer2/audio/Sonic;->oldRatePosition:I
.line 152
iput v0, p0, Lcom/google/android/exoplayer2/audio/Sonic;->newRatePosition:I
.line 153
iput v0, p0, Lcom/google/android/exoplayer2/audio/Sonic;->remainingInputToCopyFrameCount:I
.line 154
iput v0, p0, Lcom/google/android/exoplayer2/audio/Sonic;->prevPeriod:I
.line 155
iput v0, p0, Lcom/google/android/exoplayer2/audio/Sonic;->prevMinDiff:I
.line 156
iput v0, p0, Lcom/google/android/exoplayer2/audio/Sonic;->minDiff:I
.line 157
iput v0, p0, Lcom/google/android/exoplayer2/audio/Sonic;->maxDiff:I
.line 158
return-void
.end method
.method public getFramesAvailable()I
.registers 2
.line 162
iget v0, p0, Lcom/google/android/exoplayer2/audio/Sonic;->outputFrameCount:I
return v0
.end method
.method public getOutput(Ljava/nio/ShortBuffer;)V
.registers 8
.param p1, "buffer" # Ljava/nio/ShortBuffer;
.line 105
invoke-virtual {p1}, Ljava/nio/ShortBuffer;->remaining()I
move-result v0
iget v1, p0, Lcom/google/android/exoplayer2/audio/Sonic;->channelCount:I
div-int/2addr v0, v1
iget v1, p0, Lcom/google/android/exoplayer2/audio/Sonic;->outputFrameCount:I
invoke-static {v0, v1}, Ljava/lang/Math;->min(II)I
move-result v0
.line 106
.local v0, "framesToRead":I
iget-object v1, p0, Lcom/google/android/exoplayer2/audio/Sonic;->outputBuffer:[S
iget v2, p0, Lcom/google/android/exoplayer2/audio/Sonic;->channelCount:I
mul-int v2, v2, v0
const/4 v3, 0x0
invoke-virtual {p1, v1, v3, v2}, Ljava/nio/ShortBuffer;->put([SII)Ljava/nio/ShortBuffer;
.line 107
iget v1, p0, Lcom/google/android/exoplayer2/audio/Sonic;->outputFrameCount:I
sub-int/2addr v1, v0
iput v1, p0, Lcom/google/android/exoplayer2/audio/Sonic;->outputFrameCount:I
.line 108
iget-object v2, p0, Lcom/google/android/exoplayer2/audio/Sonic;->outputBuffer:[S
iget v4, p0, Lcom/google/android/exoplayer2/audio/Sonic;->channelCount:I
mul-int v5, v0, v4
mul-int v1, v1, v4
invoke-static {v2, v5, v2, v3, v1}, Ljava/lang/System;->arraycopy(Ljava/lang/Object;ILjava/lang/Object;II)V
.line 114
return-void
.end method
.method public queueEndOfStream()V
.registers 10
.line 121
iget v0, p0, Lcom/google/android/exoplayer2/audio/Sonic;->inputFrameCount:I
.line 122
.local v0, "remainingFrameCount":I
iget v1, p0, Lcom/google/android/exoplayer2/audio/Sonic;->speed:F
iget v2, p0, Lcom/google/android/exoplayer2/audio/Sonic;->pitch:F
div-float/2addr v1, v2
.line 123
.local v1, "s":F
iget v3, p0, Lcom/google/android/exoplayer2/audio/Sonic;->rate:F
mul-float v3, v3, v2
.line 124
.local v3, "r":F
iget v2, p0, Lcom/google/android/exoplayer2/audio/Sonic;->outputFrameCount:I
int-to-float v4, v0
div-float/2addr v4, v1
iget v5, p0, Lcom/google/android/exoplayer2/audio/Sonic;->pitchFrameCount:I
int-to-float v5, v5
add-float/2addr v4, v5
div-float/2addr v4, v3
const/high16 v5, 0x3f000000 # 0.5f
add-float/2addr v4, v5
float-to-int v4, v4
add-int/2addr v2, v4
.line 128
.local v2, "expectedOutputFrames":I
iget-object v4, p0, Lcom/google/android/exoplayer2/audio/Sonic;->inputBuffer:[S
iget v5, p0, Lcom/google/android/exoplayer2/audio/Sonic;->inputFrameCount:I
iget v6, p0, Lcom/google/android/exoplayer2/audio/Sonic;->maxRequiredFrameCount:I
mul-int/lit8 v6, v6, 0x2
add-int/2addr v6, v0
.line 129
invoke-direct {p0, v4, v5, v6}, Lcom/google/android/exoplayer2/audio/Sonic;->ensureSpaceForAdditionalFrames([SII)[S
move-result-object v4
iput-object v4, p0, Lcom/google/android/exoplayer2/audio/Sonic;->inputBuffer:[S
.line 131
const/4 v4, 0x0
.local v4, "xSample":I
:goto_29
iget v5, p0, Lcom/google/android/exoplayer2/audio/Sonic;->maxRequiredFrameCount:I
mul-int/lit8 v6, v5, 0x2
iget v7, p0, Lcom/google/android/exoplayer2/audio/Sonic;->channelCount:I
mul-int v6, v6, v7
const/4 v8, 0x0
if-ge v4, v6, :cond_3e
.line 132
iget-object v5, p0, Lcom/google/android/exoplayer2/audio/Sonic;->inputBuffer:[S
mul-int v7, v7, v0
add-int/2addr v7, v4
aput-short v8, v5, v7
.line 131
add-int/lit8 v4, v4, 0x1
goto :goto_29
.line 134
.end local v4 # "xSample":I
:cond_3e
iget v4, p0, Lcom/google/android/exoplayer2/audio/Sonic;->inputFrameCount:I
mul-int/lit8 v5, v5, 0x2
add-int/2addr v4, v5
iput v4, p0, Lcom/google/android/exoplayer2/audio/Sonic;->inputFrameCount:I
.line 135
invoke-direct {p0}, Lcom/google/android/exoplayer2/audio/Sonic;->processStreamInput()V
.line 137
iget v4, p0, Lcom/google/android/exoplayer2/audio/Sonic;->outputFrameCount:I
if-le v4, v2, :cond_4e
.line 138
iput v2, p0, Lcom/google/android/exoplayer2/audio/Sonic;->outputFrameCount:I
.line 141
:cond_4e
iput v8, p0, Lcom/google/android/exoplayer2/audio/Sonic;->inputFrameCount:I
.line 142
iput v8, p0, Lcom/google/android/exoplayer2/audio/Sonic;->remainingInputToCopyFrameCount:I
.line 143
iput v8, p0, Lcom/google/android/exoplayer2/audio/Sonic;->pitchFrameCount:I
.line 144
return-void
.end method
.method public queueInput(Ljava/nio/ShortBuffer;)V
.registers 7
.param p1, "buffer" # Ljava/nio/ShortBuffer;
.line 90
invoke-virtual {p1}, Ljava/nio/ShortBuffer;->remaining()I
move-result v0
iget v1, p0, Lcom/google/android/exoplayer2/audio/Sonic;->channelCount:I
div-int/2addr v0, v1
.line 91
.local v0, "framesToWrite":I
mul-int v1, v1, v0
mul-int/lit8 v1, v1, 0x2
.line 92
.local v1, "bytesToWrite":I
iget-object v2, p0, Lcom/google/android/exoplayer2/audio/Sonic;->inputBuffer:[S
iget v3, p0, Lcom/google/android/exoplayer2/audio/Sonic;->inputFrameCount:I
invoke-direct {p0, v2, v3, v0}, Lcom/google/android/exoplayer2/audio/Sonic;->ensureSpaceForAdditionalFrames([SII)[S
move-result-object v2
iput-object v2, p0, Lcom/google/android/exoplayer2/audio/Sonic;->inputBuffer:[S
.line 93
iget v3, p0, Lcom/google/android/exoplayer2/audio/Sonic;->inputFrameCount:I
iget v4, p0, Lcom/google/android/exoplayer2/audio/Sonic;->channelCount:I
mul-int v3, v3, v4
div-int/lit8 v4, v1, 0x2
invoke-virtual {p1, v2, v3, v4}, Ljava/nio/ShortBuffer;->get([SII)Ljava/nio/ShortBuffer;
.line 94
iget v2, p0, Lcom/google/android/exoplayer2/audio/Sonic;->inputFrameCount:I
add-int/2addr v2, v0
iput v2, p0, Lcom/google/android/exoplayer2/audio/Sonic;->inputFrameCount:I
.line 95
invoke-direct {p0}, Lcom/google/android/exoplayer2/audio/Sonic;->processStreamInput()V
.line 96
return-void
.end method