AudioBufferStream.smali
.class public Lcn/rongcloud/rtc/utils/AudioBufferStream;
.super Ljava/lang/Object;
.source "AudioBufferStream.java"
# annotations
.annotation system Ldalvik/annotation/MemberClasses;
value = {
Lcn/rongcloud/rtc/utils/AudioBufferStream$OnAudioReadListener;
}
.end annotation
# static fields
.field private static final MAX_BUFFER_SIZE:I = 0x4
# instance fields
.field private currentSampleTime:J
.field private inputBufferQueue:Ljava/util/concurrent/LinkedBlockingDeque;
.annotation system Ldalvik/annotation/Signature;
value = {
"Ljava/util/concurrent/LinkedBlockingDeque<",
"Ljava/nio/ByteBuffer;",
">;"
}
.end annotation
.end field
.field private mAudioResample:Lcn/rongcloud/rtc/core/audio/AudioResample;
.field private mOnAudioReadListener:Lcn/rongcloud/rtc/utils/AudioBufferStream$OnAudioReadListener;
.field private outChannelCount:I
.field private outSampleRate:I
.field private outputBufferQueue:Ljava/util/concurrent/LinkedBlockingDeque;
.annotation system Ldalvik/annotation/Signature;
value = {
"Ljava/util/concurrent/LinkedBlockingDeque<",
"Ljava/nio/ByteBuffer;",
">;"
}
.end annotation
.end field
.field private released:Z
# direct methods
.method public constructor <init>(IIII)V
.registers 12
const/4 v3, 0x2
const/4 v6, 0x2
move-object v0, p0
move v1, p1
move v2, p2
move v4, p3
move v5, p4
.line 12
invoke-direct/range {v0 .. v6}, Lcn/rongcloud/rtc/utils/AudioBufferStream;-><init>(IIIIII)V
return-void
.end method
.method public constructor <init>(IIIIII)V
.registers 16
.line 1
invoke-direct {p0}, Ljava/lang/Object;-><init>()V
const-wide/16 v0, 0x0
.line 2
iput-wide v0, p0, Lcn/rongcloud/rtc/utils/AudioBufferStream;->currentSampleTime:J
.line 3
new-instance v0, Ljava/util/concurrent/LinkedBlockingDeque;
const/4 v1, 0x4
invoke-direct {v0, v1}, Ljava/util/concurrent/LinkedBlockingDeque;-><init>(I)V
iput-object v0, p0, Lcn/rongcloud/rtc/utils/AudioBufferStream;->inputBufferQueue:Ljava/util/concurrent/LinkedBlockingDeque;
.line 4
new-instance v0, Ljava/util/concurrent/LinkedBlockingDeque;
invoke-direct {v0, v1}, Ljava/util/concurrent/LinkedBlockingDeque;-><init>(I)V
iput-object v0, p0, Lcn/rongcloud/rtc/utils/AudioBufferStream;->outputBufferQueue:Ljava/util/concurrent/LinkedBlockingDeque;
const/4 v0, 0x0
.line 5
iput-object v0, p0, Lcn/rongcloud/rtc/utils/AudioBufferStream;->mOnAudioReadListener:Lcn/rongcloud/rtc/utils/AudioBufferStream$OnAudioReadListener;
const/4 v0, 0x0
.line 6
iput-boolean v0, p0, Lcn/rongcloud/rtc/utils/AudioBufferStream;->released:Z
.line 7
iput p4, p0, Lcn/rongcloud/rtc/utils/AudioBufferStream;->outSampleRate:I
.line 8
iput p5, p0, Lcn/rongcloud/rtc/utils/AudioBufferStream;->outChannelCount:I
:goto_20
if-ge v0, v1, :cond_34
mul-int v2, p4, p5
mul-int/lit8 v2, v2, 0x2
.line 9
div-int/lit8 v2, v2, 0x2
invoke-static {v2}, Ljava/nio/ByteBuffer;->allocate(I)Ljava/nio/ByteBuffer;
move-result-object v2
.line 10
iget-object v3, p0, Lcn/rongcloud/rtc/utils/AudioBufferStream;->inputBufferQueue:Ljava/util/concurrent/LinkedBlockingDeque;
invoke-virtual {v3, v2}, Ljava/util/concurrent/LinkedBlockingDeque;->add(Ljava/lang/Object;)Z
add-int/lit8 v0, v0, 0x1
goto :goto_20
.line 11
:cond_34
new-instance v0, Lcn/rongcloud/rtc/core/audio/AudioResample;
move-object v2, v0
move v3, p1
move v4, p2
move v5, p3
move v6, p4
move v7, p5
move v8, p6
invoke-direct/range {v2 .. v8}, Lcn/rongcloud/rtc/core/audio/AudioResample;-><init>(IIIIII)V
iput-object v0, p0, Lcn/rongcloud/rtc/utils/AudioBufferStream;->mAudioResample:Lcn/rongcloud/rtc/core/audio/AudioResample;
return-void
.end method
.method private enqueueBufferFirst(Ljava/util/concurrent/LinkedBlockingDeque;Ljava/nio/ByteBuffer;)V
.registers 6
.annotation system Ldalvik/annotation/Signature;
value = {
"(",
"Ljava/util/concurrent/LinkedBlockingDeque<",
"Ljava/nio/ByteBuffer;",
">;",
"Ljava/nio/ByteBuffer;",
")V"
}
.end annotation
.annotation system Ldalvik/annotation/Throws;
value = {
Ljava/lang/InterruptedException;
}
.end annotation
:cond_0
const-wide/16 v0, 0x3e8
.line 1
sget-object v2, Ljava/util/concurrent/TimeUnit;->MILLISECONDS:Ljava/util/concurrent/TimeUnit;
invoke-virtual {p1, p2, v0, v1, v2}, Ljava/util/concurrent/LinkedBlockingDeque;->offerFirst(Ljava/lang/Object;JLjava/util/concurrent/TimeUnit;)Z
move-result v0
if-eqz v0, :cond_b
goto :goto_f
.line 2
:cond_b
iget-boolean v0, p0, Lcn/rongcloud/rtc/utils/AudioBufferStream;->released:Z
if-eqz v0, :cond_0
:goto_f
return-void
.end method
.method private enqueueBufferLast(Ljava/util/concurrent/LinkedBlockingDeque;Ljava/nio/ByteBuffer;)V
.registers 6
.annotation system Ldalvik/annotation/Signature;
value = {
"(",
"Ljava/util/concurrent/LinkedBlockingDeque<",
"Ljava/nio/ByteBuffer;",
">;",
"Ljava/nio/ByteBuffer;",
")V"
}
.end annotation
.annotation system Ldalvik/annotation/Throws;
value = {
Ljava/lang/InterruptedException;
}
.end annotation
:cond_0
const-wide/16 v0, 0x64
.line 1
sget-object v2, Ljava/util/concurrent/TimeUnit;->MILLISECONDS:Ljava/util/concurrent/TimeUnit;
invoke-virtual {p1, p2, v0, v1, v2}, Ljava/util/concurrent/LinkedBlockingDeque;->offer(Ljava/lang/Object;JLjava/util/concurrent/TimeUnit;)Z
move-result v0
if-eqz v0, :cond_b
goto :goto_f
.line 2
:cond_b
iget-boolean v0, p0, Lcn/rongcloud/rtc/utils/AudioBufferStream;->released:Z
if-eqz v0, :cond_0
:goto_f
return-void
.end method
.method private obtainBuffer(Ljava/util/concurrent/LinkedBlockingDeque;Z)Ljava/nio/ByteBuffer;
.registers 6
.annotation system Ldalvik/annotation/Signature;
value = {
"(",
"Ljava/util/concurrent/LinkedBlockingDeque<",
"Ljava/nio/ByteBuffer;",
">;Z)",
"Ljava/nio/ByteBuffer;"
}
.end annotation
.annotation system Ldalvik/annotation/Throws;
value = {
Ljava/lang/InterruptedException;
}
.end annotation
:goto_0
const-wide/16 v0, 0x64
.line 1
sget-object v2, Ljava/util/concurrent/TimeUnit;->MILLISECONDS:Ljava/util/concurrent/TimeUnit;
invoke-virtual {p1, v0, v1, v2}, Ljava/util/concurrent/LinkedBlockingDeque;->poll(JLjava/util/concurrent/TimeUnit;)Ljava/lang/Object;
move-result-object v0
check-cast v0, Ljava/nio/ByteBuffer;
if-nez v0, :cond_14
.line 2
iget-boolean v1, p0, Lcn/rongcloud/rtc/utils/AudioBufferStream;->released:Z
if-eqz v1, :cond_11
goto :goto_14
:cond_11
if-eqz p2, :cond_14
goto :goto_0
:cond_14
:goto_14
return-object v0
.end method
.method private read(IZ)[B
.registers 10
.line 3
iget v0, p0, Lcn/rongcloud/rtc/utils/AudioBufferStream;->outChannelCount:I
mul-int/lit8 v0, v0, 0x2
mul-int v1, p1, v0
.line 4
new-array v1, v1, [B
.line 5
:try_start_8
iget-object v2, p0, Lcn/rongcloud/rtc/utils/AudioBufferStream;->outputBufferQueue:Ljava/util/concurrent/LinkedBlockingDeque;
const/4 v3, 0x0
invoke-direct {p0, v2, v3}, Lcn/rongcloud/rtc/utils/AudioBufferStream;->obtainBuffer(Ljava/util/concurrent/LinkedBlockingDeque;Z)Ljava/nio/ByteBuffer;
move-result-object v2
const/4 v4, 0x0
if-nez v2, :cond_13
return-object v4
.line 6
:cond_13
invoke-virtual {v2}, Ljava/nio/ByteBuffer;->remaining()I
move-result v5
array-length v6, v1
if-le v5, v6, :cond_24
.line 7
array-length v0, v1
invoke-virtual {v2, v1, v3, v0}, Ljava/nio/ByteBuffer;->get([BII)Ljava/nio/ByteBuffer;
.line 8
iget-object v0, p0, Lcn/rongcloud/rtc/utils/AudioBufferStream;->outputBufferQueue:Ljava/util/concurrent/LinkedBlockingDeque;
invoke-direct {p0, v0, v2}, Lcn/rongcloud/rtc/utils/AudioBufferStream;->enqueueBufferFirst(Ljava/util/concurrent/LinkedBlockingDeque;Ljava/nio/ByteBuffer;)V
goto :goto_4a
.line 9
:cond_24
invoke-virtual {v2}, Ljava/nio/ByteBuffer;->remaining()I
move-result v5
.line 10
invoke-virtual {v2, v1, v3, v5}, Ljava/nio/ByteBuffer;->get([BII)Ljava/nio/ByteBuffer;
.line 11
iget-object v6, p0, Lcn/rongcloud/rtc/utils/AudioBufferStream;->inputBufferQueue:Ljava/util/concurrent/LinkedBlockingDeque;
invoke-direct {p0, v6, v2}, Lcn/rongcloud/rtc/utils/AudioBufferStream;->enqueueBufferLast(Ljava/util/concurrent/LinkedBlockingDeque;Ljava/nio/ByteBuffer;)V
.line 12
array-length v2, v1
sub-int/2addr v2, v5
div-int/2addr v2, v0
.line 13
invoke-direct {p0, v2, v3}, Lcn/rongcloud/rtc/utils/AudioBufferStream;->read(IZ)[B
move-result-object v0
if-nez v0, :cond_3a
return-object v4
.line 14
:cond_3a
array-length v2, v0
invoke-static {v0, v3, v1, v5, v2}, Ljava/lang/System;->arraycopy(Ljava/lang/Object;ILjava/lang/Object;II)V
:try_end_3e
.catch Ljava/lang/InterruptedException; {:try_start_8 .. :try_end_3e} :catch_3f
goto :goto_4a
:catch_3f
move-exception v0
.line 15
invoke-virtual {v0}, Ljava/lang/InterruptedException;->printStackTrace()V
.line 16
invoke-static {}, Ljava/lang/Thread;->currentThread()Ljava/lang/Thread;
move-result-object v0
invoke-virtual {v0}, Ljava/lang/Thread;->interrupt()V
:goto_4a
if-eqz p2, :cond_60
.line 17
iget-object p2, p0, Lcn/rongcloud/rtc/utils/AudioBufferStream;->mOnAudioReadListener:Lcn/rongcloud/rtc/utils/AudioBufferStream$OnAudioReadListener;
if-eqz p2, :cond_60
mul-int/lit16 p1, p1, 0x3e8
.line 18
iget v0, p0, Lcn/rongcloud/rtc/utils/AudioBufferStream;->outSampleRate:I
div-int/2addr p1, v0
.line 19
iget-wide v2, p0, Lcn/rongcloud/rtc/utils/AudioBufferStream;->currentSampleTime:J
int-to-long v4, p1
add-long/2addr v2, v4
iput-wide v2, p0, Lcn/rongcloud/rtc/utils/AudioBufferStream;->currentSampleTime:J
.line 20
iget-wide v2, p0, Lcn/rongcloud/rtc/utils/AudioBufferStream;->currentSampleTime:J
invoke-interface {p2, v2, v3}, Lcn/rongcloud/rtc/utils/AudioBufferStream$OnAudioReadListener;->onAudioRead(J)V
:cond_60
return-object v1
.end method
# virtual methods
.method public read(I)[B
.registers 3
.line 1
iget-object v0, p0, Lcn/rongcloud/rtc/utils/AudioBufferStream;->outputBufferQueue:Ljava/util/concurrent/LinkedBlockingDeque;
invoke-virtual {v0}, Ljava/util/concurrent/LinkedBlockingDeque;->isEmpty()Z
move-result v0
if-eqz v0, :cond_a
const/4 p1, 0x0
return-object p1
:cond_a
const/4 v0, 0x1
.line 2
invoke-direct {p0, p1, v0}, Lcn/rongcloud/rtc/utils/AudioBufferStream;->read(IZ)[B
move-result-object p1
return-object p1
.end method
.method public release()V
.registers 2
const/4 v0, 0x1
.line 1
iput-boolean v0, p0, Lcn/rongcloud/rtc/utils/AudioBufferStream;->released:Z
.line 2
iget-object v0, p0, Lcn/rongcloud/rtc/utils/AudioBufferStream;->mAudioResample:Lcn/rongcloud/rtc/core/audio/AudioResample;
invoke-virtual {v0}, Lcn/rongcloud/rtc/core/audio/AudioResample;->destroy()V
return-void
.end method
.method public setOnAudioReadListener(Lcn/rongcloud/rtc/utils/AudioBufferStream$OnAudioReadListener;)V
.registers 2
.line 1
iput-object p1, p0, Lcn/rongcloud/rtc/utils/AudioBufferStream;->mOnAudioReadListener:Lcn/rongcloud/rtc/utils/AudioBufferStream$OnAudioReadListener;
return-void
.end method
.method public write([B)V
.registers 6
.line 1
:try_start_0
iget-object v0, p0, Lcn/rongcloud/rtc/utils/AudioBufferStream;->mAudioResample:Lcn/rongcloud/rtc/core/audio/AudioResample;
invoke-virtual {v0, p1}, Lcn/rongcloud/rtc/core/audio/AudioResample;->resample([B)[B
move-result-object p1
if-nez p1, :cond_9
return-void
:cond_9
const/4 v0, 0x0
.line 2
:goto_a
array-length v1, p1
if-ge v0, v1, :cond_4b
.line 3
iget-object v1, p0, Lcn/rongcloud/rtc/utils/AudioBufferStream;->inputBufferQueue:Ljava/util/concurrent/LinkedBlockingDeque;
const/4 v2, 0x1
invoke-direct {p0, v1, v2}, Lcn/rongcloud/rtc/utils/AudioBufferStream;->obtainBuffer(Ljava/util/concurrent/LinkedBlockingDeque;Z)Ljava/nio/ByteBuffer;
move-result-object v1
if-nez v1, :cond_17
return-void
.line 4
:cond_17
invoke-virtual {v1}, Ljava/nio/ByteBuffer;->clear()Ljava/nio/Buffer;
.line 5
array-length v2, p1
sub-int/2addr v2, v0
invoke-virtual {v1}, Ljava/nio/ByteBuffer;->capacity()I
move-result v3
if-le v2, v3, :cond_2f
.line 6
invoke-virtual {v1}, Ljava/nio/ByteBuffer;->capacity()I
move-result v2
invoke-virtual {v1, p1, v0, v2}, Ljava/nio/ByteBuffer;->put([BII)Ljava/nio/ByteBuffer;
.line 7
invoke-virtual {v1}, Ljava/nio/ByteBuffer;->capacity()I
move-result v2
:goto_2d
add-int/2addr v0, v2
goto :goto_37
.line 8
:cond_2f
array-length v2, p1
sub-int/2addr v2, v0
invoke-virtual {v1, p1, v0, v2}, Ljava/nio/ByteBuffer;->put([BII)Ljava/nio/ByteBuffer;
.line 9
array-length v2, p1
sub-int/2addr v2, v0
goto :goto_2d
.line 10
:goto_37
invoke-virtual {v1}, Ljava/nio/ByteBuffer;->flip()Ljava/nio/Buffer;
.line 11
iget-object v2, p0, Lcn/rongcloud/rtc/utils/AudioBufferStream;->outputBufferQueue:Ljava/util/concurrent/LinkedBlockingDeque;
invoke-direct {p0, v2, v1}, Lcn/rongcloud/rtc/utils/AudioBufferStream;->enqueueBufferLast(Ljava/util/concurrent/LinkedBlockingDeque;Ljava/nio/ByteBuffer;)V
:try_end_3f
.catch Ljava/lang/InterruptedException; {:try_start_0 .. :try_end_3f} :catch_40
goto :goto_a
:catch_40
move-exception p1
.line 12
invoke-virtual {p1}, Ljava/lang/InterruptedException;->printStackTrace()V
.line 13
invoke-static {}, Ljava/lang/Thread;->currentThread()Ljava/lang/Thread;
move-result-object p1
invoke-virtual {p1}, Ljava/lang/Thread;->interrupt()V
:cond_4b
return-void
.end method