.class public Lorg/webrtc/voiceengine/WebRtcAudioTrack; .super Ljava/lang/Object; .source "WebRtcAudioTrack.java" # annotations .annotation system Ldalvik/annotation/MemberClasses; value = { Lorg/webrtc/voiceengine/WebRtcAudioTrack$AudioTrackThread;, Lorg/webrtc/voiceengine/WebRtcAudioTrack$ErrorCallback;, Lorg/webrtc/voiceengine/WebRtcAudioTrack$WebRtcAudioTrackErrorCallback;, Lorg/webrtc/voiceengine/WebRtcAudioTrack$AudioTrackStartErrorCode; } .end annotation # static fields .field private static final AUDIO_TRACK_THREAD_JOIN_TIMEOUT_MS:J = 0x7d0L .field private static final BITS_PER_SAMPLE:I = 0x10 .field private static final BUFFERS_PER_SECOND:I = 0x64 .field private static final CALLBACK_BUFFER_SIZE_MS:I = 0xa .field private static final DEBUG:Z = false .field private static final DEFAULT_USAGE:I .field private static final TAG:Ljava/lang/String; = "WebRtcAudioTrack" .field private static errorCallback:Lorg/webrtc/voiceengine/WebRtcAudioTrack$ErrorCallback; .field private static errorCallbackOld:Lorg/webrtc/voiceengine/WebRtcAudioTrack$WebRtcAudioTrackErrorCallback; .field private static volatile speakerMute:Z .field private static usageAttribute:I # instance fields .field private final audioManager:Landroid/media/AudioManager; .field private audioThread:Lorg/webrtc/voiceengine/WebRtcAudioTrack$AudioTrackThread; .field private audioTrack:Landroid/media/AudioTrack; .field private byteBuffer:Ljava/nio/ByteBuffer; .field private emptyBytes:[B .field private final nativeAudioTrack:J .field private final threadChecker:Lorg/webrtc/ThreadUtils$ThreadChecker; # direct methods .method static constructor ()V .locals 1 .line 49 invoke-static {}, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->getDefaultUsageAttribute()I move-result v0 sput v0, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->DEFAULT_USAGE:I sput v0, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->usageAttribute:I return-void .end method .method constructor (J)V .locals 2 .line 207 invoke-direct {p0}, Ljava/lang/Object;->()V .line 74 new-instance v0, Lorg/webrtc/ThreadUtils$ThreadChecker; invoke-direct {v0}, Lorg/webrtc/ThreadUtils$ThreadChecker;->()V iput-object v0, p0, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->threadChecker:Lorg/webrtc/ThreadUtils$ThreadChecker; .line 208 invoke-virtual {v0}, Lorg/webrtc/ThreadUtils$ThreadChecker;->checkIsOnValidThread()V .line 209 new-instance v0, Ljava/lang/StringBuilder; const-string v1, "ctor" invoke-direct {v0, v1}, Ljava/lang/StringBuilder;->(Ljava/lang/String;)V invoke-static {}, Lorg/webrtc/voiceengine/WebRtcAudioUtils;->getThreadInfo()Ljava/lang/String; move-result-object v1 invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; move-result-object v0 invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; move-result-object v0 const-string v1, "WebRtcAudioTrack" invoke-static {v1, v0}, Lorg/webrtc/Logging;->d(Ljava/lang/String;Ljava/lang/String;)V iput-wide p1, p0, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->nativeAudioTrack:J .line 212 invoke-static {}, Lorg/webrtc/ContextUtils;->getApplicationContext()Landroid/content/Context; move-result-object p1 const-string p2, "audio" invoke-virtual {p1, p2}, Landroid/content/Context;->getSystemService(Ljava/lang/String;)Ljava/lang/Object; move-result-object p1 check-cast p1, Landroid/media/AudioManager; iput-object p1, p0, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->audioManager:Landroid/media/AudioManager; return-void .end method .method static synthetic access$000(Lorg/webrtc/voiceengine/WebRtcAudioTrack;)Landroid/media/AudioTrack; .locals 0 .line 28 iget-object p0, p0, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->audioTrack:Landroid/media/AudioTrack; return-object p0 .end method .method static synthetic access$100(Z)V .locals 0 .line 28 invoke-static {p0}, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->assertTrue(Z)V return-void .end method .method static synthetic access$200(Lorg/webrtc/voiceengine/WebRtcAudioTrack;)Ljava/nio/ByteBuffer; .locals 0 .line 28 iget-object p0, p0, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->byteBuffer:Ljava/nio/ByteBuffer; return-object p0 .end method .method static synthetic access$300(Lorg/webrtc/voiceengine/WebRtcAudioTrack;)J .locals 2 .line 28 iget-wide v0, p0, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->nativeAudioTrack:J return-wide v0 .end method .method static synthetic access$400(Lorg/webrtc/voiceengine/WebRtcAudioTrack;IJ)V .locals 0 .line 28 invoke-direct {p0, p1, p2, p3}, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->nativeGetPlayoutData(IJ)V return-void .end method .method static synthetic access$500()Z .locals 1 sget-boolean v0, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->speakerMute:Z return v0 .end method .method static synthetic access$600(Lorg/webrtc/voiceengine/WebRtcAudioTrack;)[B .locals 0 .line 28 iget-object p0, p0, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->emptyBytes:[B return-object p0 .end method .method static synthetic access$700(Lorg/webrtc/voiceengine/WebRtcAudioTrack;Ljava/lang/String;)V .locals 0 .line 28 invoke-direct {p0, p1}, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->reportWebRtcAudioTrackError(Ljava/lang/String;)V return-void .end method .method private static assertTrue(Z)V .locals 1 if-eqz p0, :cond_0 return-void .line 472 :cond_0 new-instance p0, Ljava/lang/AssertionError; const-string v0, "Expected condition to be true" invoke-direct {p0, v0}, Ljava/lang/AssertionError;->(Ljava/lang/Object;)V throw p0 .end method .method private channelCountToConfiguration(I)I .locals 0 const/4 p0, 0x1 if-ne p1, p0, :cond_0 const/4 p0, 0x4 goto :goto_0 :cond_0 const/16 p0, 0xc :goto_0 return p0 .end method .method private static createAudioTrackOnLollipopOrHigher(III)Landroid/media/AudioTrack; .locals 8 const-string v0, "createAudioTrackOnLollipopOrHigher" const-string v1, "WebRtcAudioTrack" .line 393 invoke-static {v1, v0}, Lorg/webrtc/Logging;->d(Ljava/lang/String;Ljava/lang/String;)V const/4 v0, 0x0 .line 397 invoke-static {v0}, Landroid/media/AudioTrack;->getNativeOutputSampleRate(I)I move-result v0 .line 398 new-instance v2, Ljava/lang/StringBuilder; const-string v3, "nativeOutputSampleRate: " invoke-direct {v2, v3}, Ljava/lang/StringBuilder;->(Ljava/lang/String;)V invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder; move-result-object v2 invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; move-result-object v2 invoke-static {v1, v2}, Lorg/webrtc/Logging;->d(Ljava/lang/String;Ljava/lang/String;)V if-eq p0, v0, :cond_0 const-string v0, "Unable to use fast mode since requested sample rate is not native" .line 400 invoke-static {v1, v0}, Lorg/webrtc/Logging;->w(Ljava/lang/String;Ljava/lang/String;)V :cond_0 sget v0, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->usageAttribute:I sget v2, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->DEFAULT_USAGE:I if-eq v0, v2, :cond_1 .line 403 new-instance v0, Ljava/lang/StringBuilder; const-string v2, "A non default usage attribute is used: " invoke-direct {v0, v2}, Ljava/lang/StringBuilder;->(Ljava/lang/String;)V sget v2, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->usageAttribute:I invoke-virtual {v0, v2}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder; move-result-object v0 invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; move-result-object v0 invoke-static {v1, v0}, Lorg/webrtc/Logging;->w(Ljava/lang/String;Ljava/lang/String;)V .line 406 :cond_1 new-instance v0, Landroid/media/AudioTrack; new-instance v1, Landroid/media/AudioAttributes$Builder; invoke-direct {v1}, Landroid/media/AudioAttributes$Builder;->()V sget v2, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->usageAttribute:I .line 408 invoke-virtual {v1, v2}, Landroid/media/AudioAttributes$Builder;->setUsage(I)Landroid/media/AudioAttributes$Builder; move-result-object v1 const/4 v2, 0x1 .line 409 invoke-virtual {v1, v2}, Landroid/media/AudioAttributes$Builder;->setContentType(I)Landroid/media/AudioAttributes$Builder; move-result-object v1 .line 410 invoke-virtual {v1}, Landroid/media/AudioAttributes$Builder;->build()Landroid/media/AudioAttributes; move-result-object v3 new-instance v1, Landroid/media/AudioFormat$Builder; invoke-direct {v1}, Landroid/media/AudioFormat$Builder;->()V const/4 v2, 0x2 .line 412 invoke-virtual {v1, v2}, Landroid/media/AudioFormat$Builder;->setEncoding(I)Landroid/media/AudioFormat$Builder; move-result-object v1 .line 413 invoke-virtual {v1, p0}, Landroid/media/AudioFormat$Builder;->setSampleRate(I)Landroid/media/AudioFormat$Builder; move-result-object p0 .line 414 invoke-virtual {p0, p1}, Landroid/media/AudioFormat$Builder;->setChannelMask(I)Landroid/media/AudioFormat$Builder; move-result-object p0 .line 415 invoke-virtual {p0}, Landroid/media/AudioFormat$Builder;->build()Landroid/media/AudioFormat; move-result-object v4 const/4 v6, 0x1 const/4 v7, 0x0 move-object v2, v0 move v5, p2 invoke-direct/range {v2 .. v7}, Landroid/media/AudioTrack;->(Landroid/media/AudioAttributes;Landroid/media/AudioFormat;III)V return-object v0 .end method .method private static createAudioTrackOnLowerThanLollipop(III)Landroid/media/AudioTrack; .locals 8 .line 424 new-instance v7, Landroid/media/AudioTrack; const/4 v1, 0x0 const/4 v4, 0x2 const/4 v6, 0x1 move-object v0, v7 move v2, p0 move v3, p1 move v5, p2 invoke-direct/range {v0 .. v6}, Landroid/media/AudioTrack;->(IIIIII)V return-object v7 .end method .method private getBufferSizeInFrames()I .locals 0 iget-object p0, p0, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->audioTrack:Landroid/media/AudioTrack; .line 438 invoke-virtual {p0}, Landroid/media/AudioTrack;->getBufferSizeInFrames()I move-result p0 return p0 .end method .method private static getDefaultUsageAttribute()I .locals 1 const/4 v0, 0x2 return v0 .end method .method private getStreamMaxVolume()I .locals 2 iget-object v0, p0, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->threadChecker:Lorg/webrtc/ThreadUtils$ThreadChecker; .line 345 invoke-virtual {v0}, Lorg/webrtc/ThreadUtils$ThreadChecker;->checkIsOnValidThread()V const-string v0, "WebRtcAudioTrack" const-string v1, "getStreamMaxVolume" .line 346 invoke-static {v0, v1}, Lorg/webrtc/Logging;->d(Ljava/lang/String;Ljava/lang/String;)V iget-object v0, p0, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->audioManager:Landroid/media/AudioManager; const/4 v1, 0x0 if-eqz v0, :cond_0 const/4 v0, 0x1 goto :goto_0 :cond_0 move v0, v1 .line 347 :goto_0 invoke-static {v0}, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->assertTrue(Z)V iget-object p0, p0, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->audioManager:Landroid/media/AudioManager; .line 348 invoke-virtual {p0, v1}, Landroid/media/AudioManager;->getStreamMaxVolume(I)I move-result p0 return p0 .end method .method private getStreamVolume()I .locals 2 iget-object v0, p0, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->threadChecker:Lorg/webrtc/ThreadUtils$ThreadChecker; .line 372 invoke-virtual {v0}, Lorg/webrtc/ThreadUtils$ThreadChecker;->checkIsOnValidThread()V const-string v0, "WebRtcAudioTrack" const-string v1, "getStreamVolume" .line 373 invoke-static {v0, v1}, Lorg/webrtc/Logging;->d(Ljava/lang/String;Ljava/lang/String;)V iget-object v0, p0, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->audioManager:Landroid/media/AudioManager; const/4 v1, 0x0 if-eqz v0, :cond_0 const/4 v0, 0x1 goto :goto_0 :cond_0 move v0, v1 .line 374 :goto_0 invoke-static {v0}, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->assertTrue(Z)V iget-object p0, p0, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->audioManager:Landroid/media/AudioManager; .line 375 invoke-virtual {p0, v1}, Landroid/media/AudioManager;->getStreamVolume(I)I move-result p0 return p0 .end method .method private initPlayout(IID)I .locals 4 iget-object v0, p0, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->threadChecker:Lorg/webrtc/ThreadUtils$ThreadChecker; .line 219 invoke-virtual {v0}, Lorg/webrtc/ThreadUtils$ThreadChecker;->checkIsOnValidThread()V .line 220 new-instance v0, Ljava/lang/StringBuilder; const-string v1, "initPlayout(sampleRate=" invoke-direct {v0, v1}, Ljava/lang/StringBuilder;->(Ljava/lang/String;)V invoke-virtual {v0, p1}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder; move-result-object v0 const-string v1, ", channels=" invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; move-result-object v0 invoke-virtual {v0, p2}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder; move-result-object v0 const-string v1, ", bufferSizeFactor=" invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; move-result-object v0 invoke-virtual {v0, p3, p4}, Ljava/lang/StringBuilder;->append(D)Ljava/lang/StringBuilder; move-result-object v0 const-string v1, ")" invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; move-result-object v0 invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; move-result-object v0 const-string v1, "WebRtcAudioTrack" invoke-static {v1, v0}, Lorg/webrtc/Logging;->d(Ljava/lang/String;Ljava/lang/String;)V mul-int/lit8 v0, p2, 0x2 .line 224 div-int/lit8 v2, p1, 0x64 mul-int/2addr v0, v2 invoke-static {v0}, Ljava/nio/ByteBuffer;->allocateDirect(I)Ljava/nio/ByteBuffer; move-result-object v0 iput-object v0, p0, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->byteBuffer:Ljava/nio/ByteBuffer; .line 225 new-instance v0, Ljava/lang/StringBuilder; const-string v2, "byteBuffer.capacity: " invoke-direct {v0, v2}, Ljava/lang/StringBuilder;->(Ljava/lang/String;)V iget-object v2, p0, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->byteBuffer:Ljava/nio/ByteBuffer; invoke-virtual {v2}, Ljava/nio/ByteBuffer;->capacity()I move-result v2 invoke-virtual {v0, v2}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder; move-result-object v0 invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; move-result-object v0 invoke-static {v1, v0}, Lorg/webrtc/Logging;->d(Ljava/lang/String;Ljava/lang/String;)V iget-object v0, p0, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->byteBuffer:Ljava/nio/ByteBuffer; .line 226 invoke-virtual {v0}, Ljava/nio/ByteBuffer;->capacity()I move-result v0 new-array v0, v0, [B iput-object v0, p0, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->emptyBytes:[B iget-object v0, p0, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->byteBuffer:Ljava/nio/ByteBuffer; iget-wide v2, p0, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->nativeAudioTrack:J .line 230 invoke-direct {p0, v0, v2, v3}, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->nativeCacheDirectBufferAddress(Ljava/nio/ByteBuffer;J)V .line 235 invoke-direct {p0, p2}, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->channelCountToConfiguration(I)I move-result p2 const/4 v0, 0x2 .line 236 invoke-static {p1, p2, v0}, Landroid/media/AudioTrack;->getMinBufferSize(III)I move-result v0 int-to-double v2, v0 mul-double/2addr v2, p3 double-to-int p3, v2 .line 239 new-instance p4, Ljava/lang/StringBuilder; const-string v0, "minBufferSizeInBytes: " invoke-direct {p4, v0}, Ljava/lang/StringBuilder;->(Ljava/lang/String;)V invoke-virtual {p4, p3}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder; move-result-object p4 invoke-virtual {p4}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; move-result-object p4 invoke-static {v1, p4}, Lorg/webrtc/Logging;->d(Ljava/lang/String;Ljava/lang/String;)V iget-object p4, p0, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->byteBuffer:Ljava/nio/ByteBuffer; .line 245 invoke-virtual {p4}, Ljava/nio/ByteBuffer;->capacity()I move-result p4 const/4 v0, -0x1 if-ge p3, p4, :cond_0 const-string p1, "AudioTrack.getMinBufferSize returns an invalid value." .line 246 invoke-direct {p0, p1}, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->reportWebRtcAudioTrackInitError(Ljava/lang/String;)V return v0 :cond_0 iget-object p4, p0, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->audioTrack:Landroid/media/AudioTrack; if-eqz p4, :cond_1 const-string p1, "Conflict with existing AudioTrack." .line 253 invoke-direct {p0, p1}, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->reportWebRtcAudioTrackInitError(Ljava/lang/String;)V return v0 .line 266 :cond_1 :try_start_0 invoke-static {p1, p2, p3}, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->createAudioTrackOnLollipopOrHigher(III)Landroid/media/AudioTrack; move-result-object p1 iput-object p1, p0, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->audioTrack:Landroid/media/AudioTrack; :try_end_0 .catch Ljava/lang/IllegalArgumentException; {:try_start_0 .. :try_end_0} :catch_0 if-eqz p1, :cond_3 .line 282 invoke-virtual {p1}, Landroid/media/AudioTrack;->getState()I move-result p1 const/4 p2, 0x1 if-eq p1, p2, :cond_2 goto :goto_0 .line 287 :cond_2 invoke-direct {p0}, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->logMainParameters()V .line 288 invoke-direct {p0}, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->logMainParametersExtended()V return p3 :cond_3 :goto_0 const-string p1, "Initialization of audio track failed." .line 283 invoke-direct {p0, p1}, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->reportWebRtcAudioTrackInitError(Ljava/lang/String;)V .line 284 invoke-direct {p0}, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->releaseAudioResources()V return v0 :catch_0 move-exception p1 .line 274 invoke-virtual {p1}, Ljava/lang/IllegalArgumentException;->getMessage()Ljava/lang/String; move-result-object p1 invoke-direct {p0, p1}, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->reportWebRtcAudioTrackInitError(Ljava/lang/String;)V .line 275 invoke-direct {p0}, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->releaseAudioResources()V return v0 .end method .method private isVolumeFixed()Z .locals 0 iget-object p0, p0, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->audioManager:Landroid/media/AudioManager; .line 367 invoke-virtual {p0}, Landroid/media/AudioManager;->isVolumeFixed()Z move-result p0 return p0 .end method .method private logBufferCapacityInFrames()V .locals 2 .line 445 new-instance v0, Ljava/lang/StringBuilder; const-string v1, "AudioTrack: buffer capacity in frames: " invoke-direct {v0, v1}, Ljava/lang/StringBuilder;->(Ljava/lang/String;)V iget-object p0, p0, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->audioTrack:Landroid/media/AudioTrack; .line 448 invoke-virtual {p0}, Landroid/media/AudioTrack;->getBufferCapacityInFrames()I move-result p0 invoke-virtual {v0, p0}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder; move-result-object p0 invoke-virtual {p0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; move-result-object p0 const-string v0, "WebRtcAudioTrack" .line 445 invoke-static {v0, p0}, Lorg/webrtc/Logging;->d(Ljava/lang/String;Ljava/lang/String;)V return-void .end method .method private logBufferSizeInFrames()V .locals 2 .line 430 new-instance v0, Ljava/lang/StringBuilder; const-string v1, "AudioTrack: buffer size in frames: " invoke-direct {v0, v1}, Ljava/lang/StringBuilder;->(Ljava/lang/String;)V iget-object p0, p0, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->audioTrack:Landroid/media/AudioTrack; .line 432 invoke-virtual {p0}, Landroid/media/AudioTrack;->getBufferSizeInFrames()I move-result p0 invoke-virtual {v0, p0}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder; move-result-object p0 invoke-virtual {p0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; move-result-object p0 const-string v0, "WebRtcAudioTrack" .line 430 invoke-static {v0, p0}, Lorg/webrtc/Logging;->d(Ljava/lang/String;Ljava/lang/String;)V return-void .end method .method private logMainParameters()V .locals 2 .line 379 new-instance v0, Ljava/lang/StringBuilder; const-string v1, "AudioTrack: session ID: " invoke-direct {v0, v1}, Ljava/lang/StringBuilder;->(Ljava/lang/String;)V iget-object v1, p0, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->audioTrack:Landroid/media/AudioTrack; .line 380 invoke-virtual {v1}, Landroid/media/AudioTrack;->getAudioSessionId()I move-result v1 invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder; move-result-object v0 const-string v1, ", channels: " invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; move-result-object v0 iget-object v1, p0, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->audioTrack:Landroid/media/AudioTrack; .line 381 invoke-virtual {v1}, Landroid/media/AudioTrack;->getChannelCount()I move-result v1 invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder; move-result-object v0 const-string v1, ", sample rate: " invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; move-result-object v0 iget-object p0, p0, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->audioTrack:Landroid/media/AudioTrack; .line 382 invoke-virtual {p0}, Landroid/media/AudioTrack;->getSampleRate()I move-result p0 invoke-virtual {v0, p0}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder; move-result-object p0 const-string v0, ", max gain: " invoke-virtual {p0, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; move-result-object p0 .line 384 invoke-static {}, Landroid/media/AudioTrack;->getMaxVolume()F move-result v0 invoke-virtual {p0, v0}, Ljava/lang/StringBuilder;->append(F)Ljava/lang/StringBuilder; move-result-object p0 invoke-virtual {p0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; move-result-object p0 const-string v0, "WebRtcAudioTrack" .line 379 invoke-static {v0, p0}, Lorg/webrtc/Logging;->d(Ljava/lang/String;Ljava/lang/String;)V return-void .end method .method private logMainParametersExtended()V .locals 0 .line 453 invoke-direct {p0}, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->logBufferSizeInFrames()V .line 454 invoke-direct {p0}, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->logBufferCapacityInFrames()V return-void .end method .method private logUnderrunCount()V .locals 2 .line 465 new-instance v0, Ljava/lang/StringBuilder; const-string v1, "underrun count: " invoke-direct {v0, v1}, Ljava/lang/StringBuilder;->(Ljava/lang/String;)V iget-object p0, p0, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->audioTrack:Landroid/media/AudioTrack; invoke-virtual {p0}, Landroid/media/AudioTrack;->getUnderrunCount()I move-result p0 invoke-virtual {v0, p0}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder; move-result-object p0 invoke-virtual {p0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; move-result-object p0 const-string v0, "WebRtcAudioTrack" invoke-static {v0, p0}, Lorg/webrtc/Logging;->d(Ljava/lang/String;Ljava/lang/String;)V return-void .end method .method private native nativeCacheDirectBufferAddress(Ljava/nio/ByteBuffer;J)V .end method .method private native nativeGetPlayoutData(IJ)V .end method .method private releaseAudioResources()V .locals 2 const-string v0, "WebRtcAudioTrack" const-string v1, "releaseAudioResources" .line 493 invoke-static {v0, v1}, Lorg/webrtc/Logging;->d(Ljava/lang/String;Ljava/lang/String;)V iget-object v0, p0, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->audioTrack:Landroid/media/AudioTrack; if-eqz v0, :cond_0 .line 495 invoke-virtual {v0}, Landroid/media/AudioTrack;->release()V const/4 v0, 0x0 iput-object v0, p0, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->audioTrack:Landroid/media/AudioTrack; :cond_0 return-void .end method .method private reportWebRtcAudioTrackError(Ljava/lang/String;)V .locals 1 .line 524 new-instance p0, Ljava/lang/StringBuilder; const-string v0, "Run-time playback error: " invoke-direct {p0, v0}, Ljava/lang/StringBuilder;->(Ljava/lang/String;)V invoke-virtual {p0, p1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; move-result-object p0 invoke-virtual {p0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; move-result-object p0 const-string v0, "WebRtcAudioTrack" invoke-static {v0, p0}, Lorg/webrtc/Logging;->e(Ljava/lang/String;Ljava/lang/String;)V .line 525 invoke-static {v0}, Lorg/webrtc/voiceengine/WebRtcAudioUtils;->logAudioState(Ljava/lang/String;)V sget-object p0, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->errorCallbackOld:Lorg/webrtc/voiceengine/WebRtcAudioTrack$WebRtcAudioTrackErrorCallback; if-eqz p0, :cond_0 .line 527 invoke-interface {p0, p1}, Lorg/webrtc/voiceengine/WebRtcAudioTrack$WebRtcAudioTrackErrorCallback;->onWebRtcAudioTrackError(Ljava/lang/String;)V :cond_0 sget-object p0, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->errorCallback:Lorg/webrtc/voiceengine/WebRtcAudioTrack$ErrorCallback; if-eqz p0, :cond_1 .line 530 invoke-interface {p0, p1}, Lorg/webrtc/voiceengine/WebRtcAudioTrack$ErrorCallback;->onWebRtcAudioTrackError(Ljava/lang/String;)V :cond_1 return-void .end method .method private reportWebRtcAudioTrackInitError(Ljava/lang/String;)V .locals 1 .line 501 new-instance p0, Ljava/lang/StringBuilder; const-string v0, "Init playout error: " invoke-direct {p0, v0}, Ljava/lang/StringBuilder;->(Ljava/lang/String;)V invoke-virtual {p0, p1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; move-result-object p0 invoke-virtual {p0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; move-result-object p0 const-string v0, "WebRtcAudioTrack" invoke-static {v0, p0}, Lorg/webrtc/Logging;->e(Ljava/lang/String;Ljava/lang/String;)V .line 502 invoke-static {v0}, Lorg/webrtc/voiceengine/WebRtcAudioUtils;->logAudioState(Ljava/lang/String;)V sget-object p0, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->errorCallbackOld:Lorg/webrtc/voiceengine/WebRtcAudioTrack$WebRtcAudioTrackErrorCallback; if-eqz p0, :cond_0 .line 504 invoke-interface {p0, p1}, Lorg/webrtc/voiceengine/WebRtcAudioTrack$WebRtcAudioTrackErrorCallback;->onWebRtcAudioTrackInitError(Ljava/lang/String;)V :cond_0 sget-object p0, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->errorCallback:Lorg/webrtc/voiceengine/WebRtcAudioTrack$ErrorCallback; if-eqz p0, :cond_1 .line 507 invoke-interface {p0, p1}, Lorg/webrtc/voiceengine/WebRtcAudioTrack$ErrorCallback;->onWebRtcAudioTrackInitError(Ljava/lang/String;)V :cond_1 return-void .end method .method private reportWebRtcAudioTrackStartError(Lorg/webrtc/voiceengine/WebRtcAudioTrack$AudioTrackStartErrorCode;Ljava/lang/String;)V .locals 1 .line 513 new-instance p0, Ljava/lang/StringBuilder; const-string v0, "Start playout error: " invoke-direct {p0, v0}, Ljava/lang/StringBuilder;->(Ljava/lang/String;)V invoke-virtual {p0, p1}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; move-result-object p0 const-string v0, ". " invoke-virtual {p0, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; move-result-object p0 invoke-virtual {p0, p2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; move-result-object p0 invoke-virtual {p0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; move-result-object p0 const-string v0, "WebRtcAudioTrack" invoke-static {v0, p0}, Lorg/webrtc/Logging;->e(Ljava/lang/String;Ljava/lang/String;)V .line 514 invoke-static {v0}, Lorg/webrtc/voiceengine/WebRtcAudioUtils;->logAudioState(Ljava/lang/String;)V sget-object p0, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->errorCallbackOld:Lorg/webrtc/voiceengine/WebRtcAudioTrack$WebRtcAudioTrackErrorCallback; if-eqz p0, :cond_0 .line 516 invoke-interface {p0, p2}, Lorg/webrtc/voiceengine/WebRtcAudioTrack$WebRtcAudioTrackErrorCallback;->onWebRtcAudioTrackStartError(Ljava/lang/String;)V :cond_0 sget-object p0, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->errorCallback:Lorg/webrtc/voiceengine/WebRtcAudioTrack$ErrorCallback; if-eqz p0, :cond_1 .line 519 invoke-interface {p0, p1, p2}, Lorg/webrtc/voiceengine/WebRtcAudioTrack$ErrorCallback;->onWebRtcAudioTrackStartError(Lorg/webrtc/voiceengine/WebRtcAudioTrack$AudioTrackStartErrorCode;Ljava/lang/String;)V :cond_1 return-void .end method .method public static declared-synchronized setAudioTrackUsageAttribute(I)V .locals 4 const-string v0, "Default usage attribute is changed from: " const-class v1, Lorg/webrtc/voiceengine/WebRtcAudioTrack; monitor-enter v1 :try_start_0 const-string v2, "WebRtcAudioTrack" .line 58 new-instance v3, Ljava/lang/StringBuilder; invoke-direct {v3, v0}, Ljava/lang/StringBuilder;->(Ljava/lang/String;)V sget v0, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->DEFAULT_USAGE:I invoke-virtual {v3, v0}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder; move-result-object v0 const-string v3, " to " invoke-virtual {v0, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; move-result-object v0 invoke-virtual {v0, p0}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder; move-result-object v0 invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; move-result-object v0 invoke-static {v2, v0}, Lorg/webrtc/Logging;->w(Ljava/lang/String;Ljava/lang/String;)V sput p0, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->usageAttribute:I :try_end_0 .catchall {:try_start_0 .. :try_end_0} :catchall_0 .line 61 monitor-exit v1 return-void :catchall_0 move-exception p0 monitor-exit v1 throw p0 .end method .method public static setErrorCallback(Lorg/webrtc/voiceengine/WebRtcAudioTrack$ErrorCallback;)V .locals 2 const-string v0, "WebRtcAudioTrack" const-string v1, "Set extended error callback" .line 116 invoke-static {v0, v1}, Lorg/webrtc/Logging;->d(Ljava/lang/String;Ljava/lang/String;)V sput-object p0, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->errorCallback:Lorg/webrtc/voiceengine/WebRtcAudioTrack$ErrorCallback; return-void .end method .method public static setErrorCallback(Lorg/webrtc/voiceengine/WebRtcAudioTrack$WebRtcAudioTrackErrorCallback;)V .locals 2 .annotation runtime Ljava/lang/Deprecated; .end annotation const-string v0, "WebRtcAudioTrack" const-string v1, "Set error callback (deprecated" .line 111 invoke-static {v0, v1}, Lorg/webrtc/Logging;->d(Ljava/lang/String;Ljava/lang/String;)V sput-object p0, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->errorCallbackOld:Lorg/webrtc/voiceengine/WebRtcAudioTrack$WebRtcAudioTrackErrorCallback; return-void .end method .method public static setSpeakerMute(Z)V .locals 2 .line 487 new-instance v0, Ljava/lang/StringBuilder; const-string v1, "setSpeakerMute(" invoke-direct {v0, v1}, Ljava/lang/StringBuilder;->(Ljava/lang/String;)V invoke-virtual {v0, p0}, Ljava/lang/StringBuilder;->append(Z)Ljava/lang/StringBuilder; move-result-object v0 const-string v1, ")" invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; move-result-object v0 invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; move-result-object v0 const-string v1, "WebRtcAudioTrack" invoke-static {v1, v0}, Lorg/webrtc/Logging;->w(Ljava/lang/String;Ljava/lang/String;)V sput-boolean p0, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->speakerMute:Z return-void .end method .method private setStreamVolume(I)Z .locals 4 iget-object v0, p0, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->threadChecker:Lorg/webrtc/ThreadUtils$ThreadChecker; .line 353 invoke-virtual {v0}, Lorg/webrtc/ThreadUtils$ThreadChecker;->checkIsOnValidThread()V .line 354 new-instance v0, Ljava/lang/StringBuilder; const-string v1, "setStreamVolume(" invoke-direct {v0, v1}, Ljava/lang/StringBuilder;->(Ljava/lang/String;)V invoke-virtual {v0, p1}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder; move-result-object v0 const-string v1, ")" invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; move-result-object v0 invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; move-result-object v0 const-string v1, "WebRtcAudioTrack" invoke-static {v1, v0}, Lorg/webrtc/Logging;->d(Ljava/lang/String;Ljava/lang/String;)V iget-object v0, p0, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->audioManager:Landroid/media/AudioManager; const/4 v2, 0x1 const/4 v3, 0x0 if-eqz v0, :cond_0 move v0, v2 goto :goto_0 :cond_0 move v0, v3 .line 355 :goto_0 invoke-static {v0}, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->assertTrue(Z)V .line 356 invoke-direct {p0}, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->isVolumeFixed()Z move-result v0 if-eqz v0, :cond_1 const-string p0, "The device implements a fixed volume policy." .line 357 invoke-static {v1, p0}, Lorg/webrtc/Logging;->e(Ljava/lang/String;Ljava/lang/String;)V return v3 :cond_1 iget-object p0, p0, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->audioManager:Landroid/media/AudioManager; .line 360 invoke-virtual {p0, v3, p1, v3}, Landroid/media/AudioManager;->setStreamVolume(III)V return v2 .end method .method private startPlayout()Z .locals 5 iget-object v0, p0, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->threadChecker:Lorg/webrtc/ThreadUtils$ThreadChecker; .line 293 invoke-virtual {v0}, Lorg/webrtc/ThreadUtils$ThreadChecker;->checkIsOnValidThread()V const-string v0, "WebRtcAudioTrack" const-string v1, "startPlayout" .line 294 invoke-static {v0, v1}, Lorg/webrtc/Logging;->d(Ljava/lang/String;Ljava/lang/String;)V iget-object v0, p0, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->audioTrack:Landroid/media/AudioTrack; const/4 v1, 0x1 const/4 v2, 0x0 if-eqz v0, :cond_0 move v0, v1 goto :goto_0 :cond_0 move v0, v2 .line 295 :goto_0 invoke-static {v0}, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->assertTrue(Z)V iget-object v0, p0, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->audioThread:Lorg/webrtc/voiceengine/WebRtcAudioTrack$AudioTrackThread; if-nez v0, :cond_1 move v0, v1 goto :goto_1 :cond_1 move v0, v2 .line 296 :goto_1 invoke-static {v0}, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->assertTrue(Z)V :try_start_0 iget-object v0, p0, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->audioTrack:Landroid/media/AudioTrack; .line 300 invoke-virtual {v0}, Landroid/media/AudioTrack;->play()V :try_end_0 .catch Ljava/lang/IllegalStateException; {:try_start_0 .. :try_end_0} :catch_0 iget-object v0, p0, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->audioTrack:Landroid/media/AudioTrack; .line 307 invoke-virtual {v0}, Landroid/media/AudioTrack;->getPlayState()I move-result v0 const/4 v3, 0x3 if-eq v0, v3, :cond_2 .line 308 sget-object v0, Lorg/webrtc/voiceengine/WebRtcAudioTrack$AudioTrackStartErrorCode;->AUDIO_TRACK_START_STATE_MISMATCH:Lorg/webrtc/voiceengine/WebRtcAudioTrack$AudioTrackStartErrorCode; new-instance v1, Ljava/lang/StringBuilder; const-string v3, "AudioTrack.play failed - incorrect state :" invoke-direct {v1, v3}, Ljava/lang/StringBuilder;->(Ljava/lang/String;)V iget-object v3, p0, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->audioTrack:Landroid/media/AudioTrack; .line 311 invoke-virtual {v3}, Landroid/media/AudioTrack;->getPlayState()I move-result v3 invoke-virtual {v1, v3}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder; move-result-object v1 invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; move-result-object v1 .line 308 invoke-direct {p0, v0, v1}, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->reportWebRtcAudioTrackStartError(Lorg/webrtc/voiceengine/WebRtcAudioTrack$AudioTrackStartErrorCode;Ljava/lang/String;)V .line 312 invoke-direct {p0}, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->releaseAudioResources()V return v2 .line 319 :cond_2 new-instance v0, Lorg/webrtc/voiceengine/WebRtcAudioTrack$AudioTrackThread; const-string v2, "AudioTrackJavaThread" invoke-direct {v0, p0, v2}, Lorg/webrtc/voiceengine/WebRtcAudioTrack$AudioTrackThread;->(Lorg/webrtc/voiceengine/WebRtcAudioTrack;Ljava/lang/String;)V iput-object v0, p0, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->audioThread:Lorg/webrtc/voiceengine/WebRtcAudioTrack$AudioTrackThread; .line 320 invoke-virtual {v0}, Lorg/webrtc/voiceengine/WebRtcAudioTrack$AudioTrackThread;->start()V return v1 :catch_0 move-exception v0 .line 302 sget-object v1, Lorg/webrtc/voiceengine/WebRtcAudioTrack$AudioTrackStartErrorCode;->AUDIO_TRACK_START_EXCEPTION:Lorg/webrtc/voiceengine/WebRtcAudioTrack$AudioTrackStartErrorCode; new-instance v3, Ljava/lang/StringBuilder; const-string v4, "AudioTrack.play failed: " invoke-direct {v3, v4}, Ljava/lang/StringBuilder;->(Ljava/lang/String;)V .line 303 invoke-virtual {v0}, Ljava/lang/IllegalStateException;->getMessage()Ljava/lang/String; move-result-object v0 invoke-virtual {v3, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; move-result-object v0 invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; move-result-object v0 .line 302 invoke-direct {p0, v1, v0}, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->reportWebRtcAudioTrackStartError(Lorg/webrtc/voiceengine/WebRtcAudioTrack$AudioTrackStartErrorCode;Ljava/lang/String;)V .line 304 invoke-direct {p0}, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->releaseAudioResources()V return v2 .end method .method private stopPlayout()Z .locals 5 iget-object v0, p0, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->threadChecker:Lorg/webrtc/ThreadUtils$ThreadChecker; .line 325 invoke-virtual {v0}, Lorg/webrtc/ThreadUtils$ThreadChecker;->checkIsOnValidThread()V const-string v0, "stopPlayout" const-string v1, "WebRtcAudioTrack" .line 326 invoke-static {v1, v0}, Lorg/webrtc/Logging;->d(Ljava/lang/String;Ljava/lang/String;)V iget-object v0, p0, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->audioThread:Lorg/webrtc/voiceengine/WebRtcAudioTrack$AudioTrackThread; const/4 v2, 0x1 if-eqz v0, :cond_0 move v0, v2 goto :goto_0 :cond_0 const/4 v0, 0x0 .line 327 :goto_0 invoke-static {v0}, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->assertTrue(Z)V .line 328 invoke-direct {p0}, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->logUnderrunCount()V iget-object v0, p0, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->audioThread:Lorg/webrtc/voiceengine/WebRtcAudioTrack$AudioTrackThread; .line 329 invoke-virtual {v0}, Lorg/webrtc/voiceengine/WebRtcAudioTrack$AudioTrackThread;->stopThread()V const-string v0, "Stopping the AudioTrackThread..." .line 331 invoke-static {v1, v0}, Lorg/webrtc/Logging;->d(Ljava/lang/String;Ljava/lang/String;)V iget-object v0, p0, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->audioThread:Lorg/webrtc/voiceengine/WebRtcAudioTrack$AudioTrackThread; .line 332 invoke-virtual {v0}, Lorg/webrtc/voiceengine/WebRtcAudioTrack$AudioTrackThread;->interrupt()V iget-object v0, p0, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->audioThread:Lorg/webrtc/voiceengine/WebRtcAudioTrack$AudioTrackThread; const-wide/16 v3, 0x7d0 .line 333 invoke-static {v0, v3, v4}, Lorg/webrtc/ThreadUtils;->joinUninterruptibly(Ljava/lang/Thread;J)Z move-result v0 if-nez v0, :cond_1 const-string v0, "Join of AudioTrackThread timed out." .line 334 invoke-static {v1, v0}, Lorg/webrtc/Logging;->e(Ljava/lang/String;Ljava/lang/String;)V .line 335 invoke-static {v1}, Lorg/webrtc/voiceengine/WebRtcAudioUtils;->logAudioState(Ljava/lang/String;)V :cond_1 const-string v0, "AudioTrackThread has now been stopped." .line 337 invoke-static {v1, v0}, Lorg/webrtc/Logging;->d(Ljava/lang/String;Ljava/lang/String;)V const/4 v0, 0x0 iput-object v0, p0, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->audioThread:Lorg/webrtc/voiceengine/WebRtcAudioTrack$AudioTrackThread; .line 339 invoke-direct {p0}, Lorg/webrtc/voiceengine/WebRtcAudioTrack;->releaseAudioResources()V return v2 .end method