class android.speech.tts.BlockingAudioTrack
  minor version: 0
  major version: 59
  flags: flags: (0x0020) ACC_SUPER
  this_class: android.speech.tts.BlockingAudioTrack
  super_class: java.lang.Object
{
  private static final java.lang.String TAG;
    descriptor: Ljava/lang/String;
    flags: (0x001a) ACC_PRIVATE, ACC_STATIC, ACC_FINAL
    ConstantValue: "TTS.BlockingAudioTrack"

  private static final boolean DBG;
    descriptor: Z
    flags: (0x001a) ACC_PRIVATE, ACC_STATIC, ACC_FINAL
    ConstantValue: 0

  private static final long MIN_SLEEP_TIME_MS;
    descriptor: J
    flags: (0x001a) ACC_PRIVATE, ACC_STATIC, ACC_FINAL
    ConstantValue: 20

  private static final long MAX_SLEEP_TIME_MS;
    descriptor: J
    flags: (0x001a) ACC_PRIVATE, ACC_STATIC, ACC_FINAL
    ConstantValue: 2500

  private static final long MAX_PROGRESS_WAIT_MS;
    descriptor: J
    flags: (0x001a) ACC_PRIVATE, ACC_STATIC, ACC_FINAL
    ConstantValue: 2500

  private static final int MIN_AUDIO_BUFFER_SIZE;
    descriptor: I
    flags: (0x001a) ACC_PRIVATE, ACC_STATIC, ACC_FINAL
    ConstantValue: 8192

  private final android.speech.tts.TextToSpeechService$AudioOutputParams mAudioParams;
    descriptor: Landroid/speech/tts/TextToSpeechService$AudioOutputParams;
    flags: (0x0012) ACC_PRIVATE, ACC_FINAL

  private final int mSampleRateInHz;
    descriptor: I
    flags: (0x0012) ACC_PRIVATE, ACC_FINAL

  private final int mAudioFormat;
    descriptor: I
    flags: (0x0012) ACC_PRIVATE, ACC_FINAL

  private final int mChannelCount;
    descriptor: I
    flags: (0x0012) ACC_PRIVATE, ACC_FINAL

  private final int mBytesPerFrame;
    descriptor: I
    flags: (0x0012) ACC_PRIVATE, ACC_FINAL

  private boolean mIsShortUtterance;
    descriptor: Z
    flags: (0x0002) ACC_PRIVATE

  private int mAudioBufferSize;
    descriptor: I
    flags: (0x0002) ACC_PRIVATE

  private int mBytesWritten;
    descriptor: I
    flags: (0x0002) ACC_PRIVATE

  private java.lang.Object mAudioTrackLock;
    descriptor: Ljava/lang/Object;
    flags: (0x0002) ACC_PRIVATE

  private android.media.AudioTrack mAudioTrack;
    descriptor: Landroid/media/AudioTrack;
    flags: (0x0002) ACC_PRIVATE

  private volatile boolean mStopped;
    descriptor: Z
    flags: (0x0042) ACC_PRIVATE, ACC_VOLATILE

  private int mSessionId;
    descriptor: I
    flags: (0x0002) ACC_PRIVATE

  void <init>(android.speech.tts.TextToSpeechService$AudioOutputParams, int, int, int);
    descriptor: (Landroid/speech/tts/TextToSpeechService$AudioOutputParams;III)V
    flags: (0x0000) 
    Code:
      stack=3, locals=5, args_size=5
        start local 0 // android.speech.tts.BlockingAudioTrack this
        start local 1 // android.speech.tts.TextToSpeechService$AudioOutputParams audioParams
        start local 2 // int sampleRate
        start local 3 // int audioFormat
        start local 4 // int channelCount
         0: .line 78
            aload 0 /* this */
            invokespecial java.lang.Object.<init>:()V
         1: .line 68
            aload 0 /* this */
            iconst_0
            putfield android.speech.tts.BlockingAudioTrack.mBytesWritten:I
         2: .line 72
            aload 0 /* this */
            new java.lang.Object
            dup
            invokespecial java.lang.Object.<init>:()V
            putfield android.speech.tts.BlockingAudioTrack.mAudioTrackLock:Ljava/lang/Object;
         3: .line 80
            aload 0 /* this */
            aload 1 /* audioParams */
            putfield android.speech.tts.BlockingAudioTrack.mAudioParams:Landroid/speech/tts/TextToSpeechService$AudioOutputParams;
         4: .line 81
            aload 0 /* this */
            iload 2 /* sampleRate */
            putfield android.speech.tts.BlockingAudioTrack.mSampleRateInHz:I
         5: .line 82
            aload 0 /* this */
            iload 3 /* audioFormat */
            putfield android.speech.tts.BlockingAudioTrack.mAudioFormat:I
         6: .line 83
            aload 0 /* this */
            iload 4 /* channelCount */
            putfield android.speech.tts.BlockingAudioTrack.mChannelCount:I
         7: .line 85
            aload 0 /* this */
            aload 0 /* this */
            getfield android.speech.tts.BlockingAudioTrack.mAudioFormat:I
            invokestatic android.media.AudioFormat.getBytesPerSample:(I)I
            aload 0 /* this */
            getfield android.speech.tts.BlockingAudioTrack.mChannelCount:I
            imul
            putfield android.speech.tts.BlockingAudioTrack.mBytesPerFrame:I
         8: .line 86
            aload 0 /* this */
            iconst_0
            putfield android.speech.tts.BlockingAudioTrack.mIsShortUtterance:Z
         9: .line 87
            aload 0 /* this */
            iconst_0
            putfield android.speech.tts.BlockingAudioTrack.mAudioBufferSize:I
        10: .line 88
            aload 0 /* this */
            iconst_0
            putfield android.speech.tts.BlockingAudioTrack.mBytesWritten:I
        11: .line 90
            aload 0 /* this */
            aconst_null
            putfield android.speech.tts.BlockingAudioTrack.mAudioTrack:Landroid/media/AudioTrack;
        12: .line 91
            aload 0 /* this */
            iconst_0
            putfield android.speech.tts.BlockingAudioTrack.mStopped:Z
        13: .line 92
            return
        end local 4 // int channelCount
        end local 3 // int audioFormat
        end local 2 // int sampleRate
        end local 1 // android.speech.tts.TextToSpeechService$AudioOutputParams audioParams
        end local 0 // android.speech.tts.BlockingAudioTrack this
      LocalVariableTable:
        Start  End  Slot          Name  Signature
            0   14     0          this  Landroid/speech/tts/BlockingAudioTrack;
            0   14     1   audioParams  Landroid/speech/tts/TextToSpeechService$AudioOutputParams;
            0   14     2    sampleRate  I
            0   14     3   audioFormat  I
            0   14     4  channelCount  I
    MethodParameters:
              Name  Flags
      audioParams   
      sampleRate    
      audioFormat   
      channelCount  

  public boolean init();
    descriptor: ()Z
    flags: (0x0001) ACC_PUBLIC
    Code:
      stack=2, locals=3, args_size=1
        start local 0 // android.speech.tts.BlockingAudioTrack this
         0: .line 95
            aload 0 /* this */
            invokevirtual android.speech.tts.BlockingAudioTrack.createStreamingAudioTrack:()Landroid/media/AudioTrack;
            astore 1 /* track */
        start local 1 // android.media.AudioTrack track
         1: .line 96
            aload 0 /* this */
            getfield android.speech.tts.BlockingAudioTrack.mAudioTrackLock:Ljava/lang/Object;
            dup
            astore 2
            monitorenter
         2: .line 97
            aload 0 /* this */
            aload 1 /* track */
            putfield android.speech.tts.BlockingAudioTrack.mAudioTrack:Landroid/media/AudioTrack;
         3: .line 96
            aload 2
            monitorexit
         4: goto 7
      StackMap locals: android.speech.tts.BlockingAudioTrack android.media.AudioTrack java.lang.Object
      StackMap stack: java.lang.Throwable
         5: aload 2
            monitorexit
         6: athrow
         7: .line 100
      StackMap locals:
      StackMap stack:
            aload 1 /* track */
            ifnonnull 9
         8: .line 101
            iconst_0
            ireturn
         9: .line 103
      StackMap locals:
      StackMap stack:
            iconst_1
            ireturn
        end local 1 // android.media.AudioTrack track
        end local 0 // android.speech.tts.BlockingAudioTrack this
      LocalVariableTable:
        Start  End  Slot   Name  Signature
            0   10     0   this  Landroid/speech/tts/BlockingAudioTrack;
            1   10     1  track  Landroid/media/AudioTrack;
      Exception table:
        from    to  target  type
           2     4       5  any
           5     6       5  any

  public void stop();
    descriptor: ()V
    flags: (0x0001) ACC_PUBLIC
    Code:
      stack=2, locals=2, args_size=1
        start local 0 // android.speech.tts.BlockingAudioTrack this
         0: .line 108
            aload 0 /* this */
            getfield android.speech.tts.BlockingAudioTrack.mAudioTrackLock:Ljava/lang/Object;
            dup
            astore 1
            monitorenter
         1: .line 109
            aload 0 /* this */
            getfield android.speech.tts.BlockingAudioTrack.mAudioTrack:Landroid/media/AudioTrack;
            ifnull 3
         2: .line 110
            aload 0 /* this */
            getfield android.speech.tts.BlockingAudioTrack.mAudioTrack:Landroid/media/AudioTrack;
            invokevirtual android.media.AudioTrack.stop:()V
         3: .line 112
      StackMap locals: java.lang.Object
      StackMap stack:
            aload 0 /* this */
            iconst_1
            putfield android.speech.tts.BlockingAudioTrack.mStopped:Z
         4: .line 108
            aload 1
            monitorexit
         5: goto 8
      StackMap locals:
      StackMap stack: java.lang.Throwable
         6: aload 1
            monitorexit
         7: athrow
         8: .line 114
      StackMap locals:
      StackMap stack:
            return
        end local 0 // android.speech.tts.BlockingAudioTrack this
      LocalVariableTable:
        Start  End  Slot  Name  Signature
            0    9     0  this  Landroid/speech/tts/BlockingAudioTrack;
      Exception table:
        from    to  target  type
           1     5       6  any
           6     7       6  any

  public int write(byte[]);
    descriptor: ([B)I
    flags: (0x0001) ACC_PUBLIC
    Code:
      stack=3, locals=4, args_size=2
        start local 0 // android.speech.tts.BlockingAudioTrack this
        start local 1 // byte[] data
         0: .line 117
            aconst_null
            astore 2 /* track */
        start local 2 // android.media.AudioTrack track
         1: .line 118
            aload 0 /* this */
            getfield android.speech.tts.BlockingAudioTrack.mAudioTrackLock:Ljava/lang/Object;
            dup
            astore 3
            monitorenter
         2: .line 119
            aload 0 /* this */
            getfield android.speech.tts.BlockingAudioTrack.mAudioTrack:Landroid/media/AudioTrack;
            astore 2 /* track */
         3: .line 118
            aload 3
            monitorexit
         4: goto 7
      StackMap locals: android.speech.tts.BlockingAudioTrack byte[] android.media.AudioTrack java.lang.Object
      StackMap stack: java.lang.Throwable
         5: aload 3
            monitorexit
         6: athrow
         7: .line 122
      StackMap locals:
      StackMap stack:
            aload 2 /* track */
            ifnull 8
            aload 0 /* this */
            getfield android.speech.tts.BlockingAudioTrack.mStopped:Z
            ifeq 9
         8: .line 123
      StackMap locals:
      StackMap stack:
            iconst_m1
            ireturn
         9: .line 125
      StackMap locals:
      StackMap stack:
            aload 2 /* track */
            aload 1 /* data */
            invokestatic android.speech.tts.BlockingAudioTrack.writeToAudioTrack:(Landroid/media/AudioTrack;[B)I
            istore 3 /* bytesWritten */
        start local 3 // int bytesWritten
        10: .line 127
            aload 0 /* this */
            dup
            getfield android.speech.tts.BlockingAudioTrack.mBytesWritten:I
            iload 3 /* bytesWritten */
            iadd
            putfield android.speech.tts.BlockingAudioTrack.mBytesWritten:I
        11: .line 128
            iload 3 /* bytesWritten */
            ireturn
        end local 3 // int bytesWritten
        end local 2 // android.media.AudioTrack track
        end local 1 // byte[] data
        end local 0 // android.speech.tts.BlockingAudioTrack this
      LocalVariableTable:
        Start  End  Slot          Name  Signature
            0   12     0          this  Landroid/speech/tts/BlockingAudioTrack;
            0   12     1          data  [B
            1   12     2         track  Landroid/media/AudioTrack;
           10   12     3  bytesWritten  I
      Exception table:
        from    to  target  type
           2     4       5  any
           5     6       5  any
    MethodParameters:
      Name  Flags
      data  

  public void waitAndRelease();
    descriptor: ()V
    flags: (0x0001) ACC_PUBLIC
    Code:
      stack=2, locals=3, args_size=1
        start local 0 // android.speech.tts.BlockingAudioTrack this
         0: .line 132
            aconst_null
            astore 1 /* track */
        start local 1 // android.media.AudioTrack track
         1: .line 133
            aload 0 /* this */
            getfield android.speech.tts.BlockingAudioTrack.mAudioTrackLock:Ljava/lang/Object;
            dup
            astore 2
            monitorenter
         2: .line 134
            aload 0 /* this */
            getfield android.speech.tts.BlockingAudioTrack.mAudioTrack:Landroid/media/AudioTrack;
            astore 1 /* track */
         3: .line 133
            aload 2
            monitorexit
         4: goto 7
      StackMap locals: android.speech.tts.BlockingAudioTrack android.media.AudioTrack java.lang.Object
      StackMap stack: java.lang.Throwable
         5: aload 2
            monitorexit
         6: athrow
         7: .line 136
      StackMap locals:
      StackMap stack:
            aload 1 /* track */
            ifnonnull 9
         8: .line 138
            return
         9: .line 147
      StackMap locals:
      StackMap stack:
            aload 0 /* this */
            getfield android.speech.tts.BlockingAudioTrack.mBytesWritten:I
            aload 0 /* this */
            getfield android.speech.tts.BlockingAudioTrack.mAudioBufferSize:I
            if_icmpge 12
            aload 0 /* this */
            getfield android.speech.tts.BlockingAudioTrack.mStopped:Z
            ifne 12
        10: .line 153
            aload 0 /* this */
            iconst_1
            putfield android.speech.tts.BlockingAudioTrack.mIsShortUtterance:Z
        11: .line 154
            aload 1 /* track */
            invokevirtual android.media.AudioTrack.stop:()V
        12: .line 158
      StackMap locals:
      StackMap stack:
            aload 0 /* this */
            getfield android.speech.tts.BlockingAudioTrack.mStopped:Z
            ifne 14
        13: .line 160
            aload 0 /* this */
            aload 0 /* this */
            getfield android.speech.tts.BlockingAudioTrack.mAudioTrack:Landroid/media/AudioTrack;
            invokevirtual android.speech.tts.BlockingAudioTrack.blockUntilDone:(Landroid/media/AudioTrack;)V
        14: .line 167
      StackMap locals:
      StackMap stack:
            aload 0 /* this */
            getfield android.speech.tts.BlockingAudioTrack.mAudioTrackLock:Ljava/lang/Object;
            dup
            astore 2
            monitorenter
        15: .line 168
            aload 0 /* this */
            aconst_null
            putfield android.speech.tts.BlockingAudioTrack.mAudioTrack:Landroid/media/AudioTrack;
        16: .line 167
            aload 2
            monitorexit
        17: goto 20
      StackMap locals: android.speech.tts.BlockingAudioTrack android.media.AudioTrack java.lang.Object
      StackMap stack: java.lang.Throwable
        18: aload 2
            monitorexit
        19: athrow
        20: .line 170
      StackMap locals:
      StackMap stack:
            aload 1 /* track */
            invokevirtual android.media.AudioTrack.release:()V
        21: .line 171
            return
        end local 1 // android.media.AudioTrack track
        end local 0 // android.speech.tts.BlockingAudioTrack this
      LocalVariableTable:
        Start  End  Slot   Name  Signature
            0   22     0   this  Landroid/speech/tts/BlockingAudioTrack;
            1   22     1  track  Landroid/media/AudioTrack;
      Exception table:
        from    to  target  type
           2     4       5  any
           5     6       5  any
          15    17      18  any
          18    19      18  any

  static int getChannelConfig(int);
    descriptor: (I)I
    flags: (0x0008) ACC_STATIC
    Code:
      stack=2, locals=1, args_size=1
        start local 0 // int channelCount
         0: .line 175
            iload 0 /* channelCount */
            iconst_1
            if_icmpne 2
         1: .line 176
            iconst_4
            ireturn
         2: .line 177
      StackMap locals:
      StackMap stack:
            iload 0 /* channelCount */
            iconst_2
            if_icmpne 4
         3: .line 178
            bipush 12
            ireturn
         4: .line 181
      StackMap locals:
      StackMap stack:
            iconst_0
            ireturn
        end local 0 // int channelCount
      LocalVariableTable:
        Start  End  Slot          Name  Signature
            0    5     0  channelCount  I
    MethodParameters:
              Name  Flags
      channelCount  

  long getAudioLengthMs(int);
    descriptor: (I)J
    flags: (0x0000) 
    Code:
      stack=2, locals=5, args_size=2
        start local 0 // android.speech.tts.BlockingAudioTrack this
        start local 1 // int numBytes
         0: .line 185
            iload 1 /* numBytes */
            aload 0 /* this */
            getfield android.speech.tts.BlockingAudioTrack.mBytesPerFrame:I
            idiv
            istore 2 /* unconsumedFrames */
        start local 2 // int unconsumedFrames
         1: .line 186
            iload 2 /* unconsumedFrames */
            sipush 1000
            imul
            aload 0 /* this */
            getfield android.speech.tts.BlockingAudioTrack.mSampleRateInHz:I
            idiv
            i2l
            lstore 3 /* estimatedTimeMs */
        start local 3 // long estimatedTimeMs
         2: .line 188
            lload 3 /* estimatedTimeMs */
            lreturn
        end local 3 // long estimatedTimeMs
        end local 2 // int unconsumedFrames
        end local 1 // int numBytes
        end local 0 // android.speech.tts.BlockingAudioTrack this
      LocalVariableTable:
        Start  End  Slot              Name  Signature
            0    3     0              this  Landroid/speech/tts/BlockingAudioTrack;
            0    3     1          numBytes  I
            1    3     2  unconsumedFrames  I
            2    3     3   estimatedTimeMs  J
    MethodParameters:
          Name  Flags
      numBytes  

  private static int writeToAudioTrack(android.media.AudioTrack, byte[]);
    descriptor: (Landroid/media/AudioTrack;[B)I
    flags: (0x000a) ACC_PRIVATE, ACC_STATIC
    Code:
      stack=4, locals=4, args_size=2
        start local 0 // android.media.AudioTrack audioTrack
        start local 1 // byte[] bytes
         0: .line 192
            aload 0 /* audioTrack */
            invokevirtual android.media.AudioTrack.getPlayState:()I
            iconst_3
            if_icmpeq 2
         1: .line 194
            aload 0 /* audioTrack */
            invokevirtual android.media.AudioTrack.play:()V
         2: .line 197
      StackMap locals:
      StackMap stack:
            iconst_0
            istore 2 /* count */
        start local 2 // int count
         3: .line 198
            goto 8
         4: .line 201
      StackMap locals: int
      StackMap stack:
            aload 0 /* audioTrack */
            aload 1 /* bytes */
            iload 2 /* count */
            aload 1 /* bytes */
            arraylength
            invokevirtual android.media.AudioTrack.write:([BII)I
            istore 3 /* written */
        start local 3 // int written
         5: .line 202
            iload 3 /* written */
            ifgt 7
         6: .line 203
            goto 9
         7: .line 205
      StackMap locals: int
      StackMap stack:
            iload 2 /* count */
            iload 3 /* written */
            iadd
            istore 2 /* count */
        end local 3 // int written
         8: .line 198
      StackMap locals:
      StackMap stack:
            iload 2 /* count */
            aload 1 /* bytes */
            arraylength
            if_icmplt 4
         9: .line 207
      StackMap locals:
      StackMap stack:
            iload 2 /* count */
            ireturn
        end local 2 // int count
        end local 1 // byte[] bytes
        end local 0 // android.media.AudioTrack audioTrack
      LocalVariableTable:
        Start  End  Slot        Name  Signature
            0   10     0  audioTrack  Landroid/media/AudioTrack;
            0   10     1       bytes  [B
            3   10     2       count  I
            5    8     3     written  I
    MethodParameters:
            Name  Flags
      audioTrack  
      bytes       

  private android.media.AudioTrack createStreamingAudioTrack();
    descriptor: ()Landroid/media/AudioTrack;
    flags: (0x0002) ACC_PRIVATE
    Code:
      stack=7, locals=6, args_size=1
        start local 0 // android.speech.tts.BlockingAudioTrack this
         0: .line 211
            aload 0 /* this */
            getfield android.speech.tts.BlockingAudioTrack.mChannelCount:I
            invokestatic android.speech.tts.BlockingAudioTrack.getChannelConfig:(I)I
            istore 1 /* channelConfig */
        start local 1 // int channelConfig
         1: .line 214
            aload 0 /* this */
            getfield android.speech.tts.BlockingAudioTrack.mSampleRateInHz:I
            iload 1 /* channelConfig */
            aload 0 /* this */
            getfield android.speech.tts.BlockingAudioTrack.mAudioFormat:I
            invokestatic android.media.AudioTrack.getMinBufferSize:(III)I
         2: .line 213
            istore 2 /* minBufferSizeInBytes */
        start local 2 // int minBufferSizeInBytes
         3: .line 215
            sipush 8192
            iload 2 /* minBufferSizeInBytes */
            invokestatic java.lang.Math.max:(II)I
            istore 3 /* bufferSizeInBytes */
        start local 3 // int bufferSizeInBytes
         4: .line 217
            new android.media.AudioFormat$Builder
            dup
            invokespecial android.media.AudioFormat$Builder.<init>:()V
         5: .line 218
            iload 1 /* channelConfig */
            invokevirtual android.media.AudioFormat$Builder.setChannelMask:(I)Landroid/media/AudioFormat$Builder;
         6: .line 219
            aload 0 /* this */
            getfield android.speech.tts.BlockingAudioTrack.mAudioFormat:I
            invokevirtual android.media.AudioFormat$Builder.setEncoding:(I)Landroid/media/AudioFormat$Builder;
         7: .line 220
            aload 0 /* this */
            getfield android.speech.tts.BlockingAudioTrack.mSampleRateInHz:I
            invokevirtual android.media.AudioFormat$Builder.setSampleRate:(I)Landroid/media/AudioFormat$Builder;
            invokevirtual android.media.AudioFormat$Builder.build:()Landroid/media/AudioFormat;
         8: .line 217
            astore 4 /* audioFormat */
        start local 4 // android.media.AudioFormat audioFormat
         9: .line 221
            new android.media.AudioTrack
            dup
            aload 0 /* this */
            getfield android.speech.tts.BlockingAudioTrack.mAudioParams:Landroid/speech/tts/TextToSpeechService$AudioOutputParams;
            getfield android.speech.tts.TextToSpeechService$AudioOutputParams.mAudioAttributes:Landroid/media/AudioAttributes;
        10: .line 222
            aload 4 /* audioFormat */
            iload 3 /* bufferSizeInBytes */
            iconst_1
        11: .line 223
            aload 0 /* this */
            getfield android.speech.tts.BlockingAudioTrack.mAudioParams:Landroid/speech/tts/TextToSpeechService$AudioOutputParams;
            getfield android.speech.tts.TextToSpeechService$AudioOutputParams.mSessionId:I
        12: .line 221
            invokespecial android.media.AudioTrack.<init>:(Landroid/media/AudioAttributes;Landroid/media/AudioFormat;III)V
            astore 5 /* audioTrack */
        start local 5 // android.media.AudioTrack audioTrack
        13: .line 225
            aload 5 /* audioTrack */
            invokevirtual android.media.AudioTrack.getState:()I
            iconst_1
            if_icmpeq 17
        14: .line 226
            ldc "TTS.BlockingAudioTrack"
            ldc "Unable to create audio track."
            invokestatic android.util.Log.w:(Ljava/lang/String;Ljava/lang/String;)I
            pop
        15: .line 227
            aload 5 /* audioTrack */
            invokevirtual android.media.AudioTrack.release:()V
        16: .line 228
            aconst_null
            areturn
        17: .line 231
      StackMap locals: android.speech.tts.BlockingAudioTrack int int int android.media.AudioFormat android.media.AudioTrack
      StackMap stack:
            aload 0 /* this */
            iload 3 /* bufferSizeInBytes */
            putfield android.speech.tts.BlockingAudioTrack.mAudioBufferSize:I
        18: .line 233
            aload 5 /* audioTrack */
            aload 0 /* this */
            getfield android.speech.tts.BlockingAudioTrack.mAudioParams:Landroid/speech/tts/TextToSpeechService$AudioOutputParams;
            getfield android.speech.tts.TextToSpeechService$AudioOutputParams.mVolume:F
            aload 0 /* this */
            getfield android.speech.tts.BlockingAudioTrack.mAudioParams:Landroid/speech/tts/TextToSpeechService$AudioOutputParams;
            getfield android.speech.tts.TextToSpeechService$AudioOutputParams.mPan:F
            invokestatic android.speech.tts.BlockingAudioTrack.setupVolume:(Landroid/media/AudioTrack;FF)V
        19: .line 234
            aload 5 /* audioTrack */
            areturn
        end local 5 // android.media.AudioTrack audioTrack
        end local 4 // android.media.AudioFormat audioFormat
        end local 3 // int bufferSizeInBytes
        end local 2 // int minBufferSizeInBytes
        end local 1 // int channelConfig
        end local 0 // android.speech.tts.BlockingAudioTrack this
      LocalVariableTable:
        Start  End  Slot                  Name  Signature
            0   20     0                  this  Landroid/speech/tts/BlockingAudioTrack;
            1   20     1         channelConfig  I
            3   20     2  minBufferSizeInBytes  I
            4   20     3     bufferSizeInBytes  I
            9   20     4           audioFormat  Landroid/media/AudioFormat;
           13   20     5            audioTrack  Landroid/media/AudioTrack;

  private void blockUntilDone(android.media.AudioTrack);
    descriptor: (Landroid/media/AudioTrack;)V
    flags: (0x0002) ACC_PRIVATE
    Code:
      stack=2, locals=2, args_size=2
        start local 0 // android.speech.tts.BlockingAudioTrack this
        start local 1 // android.media.AudioTrack audioTrack
         0: .line 238
            aload 0 /* this */
            getfield android.speech.tts.BlockingAudioTrack.mBytesWritten:I
            ifgt 2
         1: .line 239
            return
         2: .line 242
      StackMap locals:
      StackMap stack:
            aload 0 /* this */
            getfield android.speech.tts.BlockingAudioTrack.mIsShortUtterance:Z
            ifeq 5
         3: .line 254
            aload 0 /* this */
            invokevirtual android.speech.tts.BlockingAudioTrack.blockUntilEstimatedCompletion:()V
         4: .line 255
            goto 6
         5: .line 256
      StackMap locals:
      StackMap stack:
            aload 0 /* this */
            aload 1 /* audioTrack */
            invokevirtual android.speech.tts.BlockingAudioTrack.blockUntilCompletion:(Landroid/media/AudioTrack;)V
         6: .line 258
      StackMap locals:
      StackMap stack:
            return
        end local 1 // android.media.AudioTrack audioTrack
        end local 0 // android.speech.tts.BlockingAudioTrack this
      LocalVariableTable:
        Start  End  Slot        Name  Signature
            0    7     0        this  Landroid/speech/tts/BlockingAudioTrack;
            0    7     1  audioTrack  Landroid/media/AudioTrack;
    MethodParameters:
            Name  Flags
      audioTrack  

  private void blockUntilEstimatedCompletion();
    descriptor: ()V
    flags: (0x0002) ACC_PRIVATE
    Code:
      stack=2, locals=4, args_size=1
        start local 0 // android.speech.tts.BlockingAudioTrack this
         0: .line 261
            aload 0 /* this */
            getfield android.speech.tts.BlockingAudioTrack.mBytesWritten:I
            aload 0 /* this */
            getfield android.speech.tts.BlockingAudioTrack.mBytesPerFrame:I
            idiv
            istore 1 /* lengthInFrames */
        start local 1 // int lengthInFrames
         1: .line 262
            iload 1 /* lengthInFrames */
            sipush 1000
            imul
            aload 0 /* this */
            getfield android.speech.tts.BlockingAudioTrack.mSampleRateInHz:I
            idiv
            i2l
            lstore 2 /* estimatedTimeMs */
        start local 2 // long estimatedTimeMs
         2: .line 267
            lload 2 /* estimatedTimeMs */
            invokestatic java.lang.Thread.sleep:(J)V
         3: .line 268
            goto 5
      StackMap locals: android.speech.tts.BlockingAudioTrack int long
      StackMap stack: java.lang.InterruptedException
         4: pop
         5: .line 271
      StackMap locals:
      StackMap stack:
            return
        end local 2 // long estimatedTimeMs
        end local 1 // int lengthInFrames
        end local 0 // android.speech.tts.BlockingAudioTrack this
      LocalVariableTable:
        Start  End  Slot             Name  Signature
            0    6     0             this  Landroid/speech/tts/BlockingAudioTrack;
            1    6     1   lengthInFrames  I
            2    6     2  estimatedTimeMs  J
      Exception table:
        from    to  target  type
           2     3       4  Class java.lang.InterruptedException

  private void blockUntilCompletion(android.media.AudioTrack);
    descriptor: (Landroid/media/AudioTrack;)V
    flags: (0x0002) ACC_PRIVATE
    Code:
      stack=6, locals=11, args_size=2
        start local 0 // android.speech.tts.BlockingAudioTrack this
        start local 1 // android.media.AudioTrack audioTrack
         0: .line 274
            aload 0 /* this */
            getfield android.speech.tts.BlockingAudioTrack.mBytesWritten:I
            aload 0 /* this */
            getfield android.speech.tts.BlockingAudioTrack.mBytesPerFrame:I
            idiv
            istore 2 /* lengthInFrames */
        start local 2 // int lengthInFrames
         1: .line 276
            iconst_m1
            istore 3 /* previousPosition */
        start local 3 // int previousPosition
         2: .line 277
            iconst_0
            istore 4 /* currentPosition */
        start local 4 // int currentPosition
         3: .line 278
            lconst_0
            lstore 5 /* blockedTimeMs */
        start local 5 // long blockedTimeMs
         4: .line 280
            goto 20
         5: .line 283
      StackMap locals: android.speech.tts.BlockingAudioTrack android.media.AudioTrack int int int long
      StackMap stack:
            iload 2 /* lengthInFrames */
            iload 4 /* currentPosition */
            isub
            sipush 1000
            imul
         6: .line 284
            aload 1 /* audioTrack */
            invokevirtual android.media.AudioTrack.getSampleRate:()I
         7: .line 283
            idiv
            i2l
            lstore 7 /* estimatedTimeMs */
        start local 7 // long estimatedTimeMs
         8: .line 285
            lload 7 /* estimatedTimeMs */
            ldc 20
            ldc 2500
            invokestatic android.speech.tts.BlockingAudioTrack.clip:(JJJ)J
            lstore 9 /* sleepTimeMs */
        start local 9 // long sleepTimeMs
         9: .line 290
            iload 4 /* currentPosition */
            iload 3 /* previousPosition */
            if_icmpne 14
        10: .line 293
            lload 5 /* blockedTimeMs */
            lload 9 /* sleepTimeMs */
            ladd
            lstore 5 /* blockedTimeMs */
        11: .line 295
            lload 5 /* blockedTimeMs */
            ldc 2500
            lcmp
            ifle 15
        12: .line 296
            ldc "TTS.BlockingAudioTrack"
            ldc "Waited unsuccessfully for 2500ms for AudioTrack to make progress, Aborting"
            invokestatic android.util.Log.w:(Ljava/lang/String;Ljava/lang/String;)I
            pop
        13: .line 298
            goto 22
        14: .line 301
      StackMap locals: long long
      StackMap stack:
            lconst_0
            lstore 5 /* blockedTimeMs */
        15: .line 303
      StackMap locals:
      StackMap stack:
            iload 4 /* currentPosition */
            istore 3 /* previousPosition */
        16: .line 311
            lload 9 /* sleepTimeMs */
            invokestatic java.lang.Thread.sleep:(J)V
        17: .line 312
            goto 20
      StackMap locals:
      StackMap stack: java.lang.InterruptedException
        18: pop
        19: .line 313
            goto 22
        end local 9 // long sleepTimeMs
        end local 7 // long estimatedTimeMs
        20: .line 280
      StackMap locals:
      StackMap stack:
            aload 1 /* audioTrack */
            invokevirtual android.media.AudioTrack.getPlaybackHeadPosition:()I
            dup
            istore 4 /* currentPosition */
            iload 2 /* lengthInFrames */
            if_icmpge 22
        21: .line 281
            aload 1 /* audioTrack */
            invokevirtual android.media.AudioTrack.getPlayState:()I
            iconst_3
            if_icmpne 22
            aload 0 /* this */
            getfield android.speech.tts.BlockingAudioTrack.mStopped:Z
            ifeq 5
        22: .line 316
      StackMap locals:
      StackMap stack:
            return
        end local 5 // long blockedTimeMs
        end local 4 // int currentPosition
        end local 3 // int previousPosition
        end local 2 // int lengthInFrames
        end local 1 // android.media.AudioTrack audioTrack
        end local 0 // android.speech.tts.BlockingAudioTrack this
      LocalVariableTable:
        Start  End  Slot              Name  Signature
            0   23     0              this  Landroid/speech/tts/BlockingAudioTrack;
            0   23     1        audioTrack  Landroid/media/AudioTrack;
            1   23     2    lengthInFrames  I
            2   23     3  previousPosition  I
            3   23     4   currentPosition  I
            4   23     5     blockedTimeMs  J
            8   20     7   estimatedTimeMs  J
            9   20     9       sleepTimeMs  J
      Exception table:
        from    to  target  type
          16    17      18  Class java.lang.InterruptedException
    MethodParameters:
            Name  Flags
      audioTrack  

  private static void setupVolume(android.media.AudioTrack, float, float);
    descriptor: (Landroid/media/AudioTrack;FF)V
    flags: (0x000a) ACC_PRIVATE, ACC_STATIC
    Code:
      stack=3, locals=7, args_size=3
        start local 0 // android.media.AudioTrack audioTrack
        start local 1 // float volume
        start local 2 // float pan
         0: .line 319
            fload 1 /* volume */
            fconst_0
            fconst_1
            invokestatic android.speech.tts.BlockingAudioTrack.clip:(FFF)F
            fstore 3 /* vol */
        start local 3 // float vol
         1: .line 320
            fload 2 /* pan */
            ldc -1.0
            fconst_1
            invokestatic android.speech.tts.BlockingAudioTrack.clip:(FFF)F
            fstore 4 /* panning */
        start local 4 // float panning
         2: .line 322
            fload 3 /* vol */
            fstore 5 /* volLeft */
        start local 5 // float volLeft
         3: .line 323
            fload 3 /* vol */
            fstore 6 /* volRight */
        start local 6 // float volRight
         4: .line 324
            fload 4 /* panning */
            fconst_0
            fcmpl
            ifle 7
         5: .line 325
            fload 5 /* volLeft */
            fconst_1
            fload 4 /* panning */
            fsub
            fmul
            fstore 5 /* volLeft */
         6: .line 326
            goto 9
      StackMap locals: android.media.AudioTrack float float float float float float
      StackMap stack:
         7: fload 4 /* panning */
            fconst_0
            fcmpg
            ifge 9
         8: .line 327
            fload 6 /* volRight */
            fconst_1
            fload 4 /* panning */
            fadd
            fmul
            fstore 6 /* volRight */
         9: .line 330
      StackMap locals:
      StackMap stack:
            aload 0 /* audioTrack */
            fload 5 /* volLeft */
            fload 6 /* volRight */
            invokevirtual android.media.AudioTrack.setStereoVolume:(FF)I
            ifeq 11
        10: .line 331
            ldc "TTS.BlockingAudioTrack"
            ldc "Failed to set volume"
            invokestatic android.util.Log.e:(Ljava/lang/String;Ljava/lang/String;)I
            pop
        11: .line 333
      StackMap locals:
      StackMap stack:
            return
        end local 6 // float volRight
        end local 5 // float volLeft
        end local 4 // float panning
        end local 3 // float vol
        end local 2 // float pan
        end local 1 // float volume
        end local 0 // android.media.AudioTrack audioTrack
      LocalVariableTable:
        Start  End  Slot        Name  Signature
            0   12     0  audioTrack  Landroid/media/AudioTrack;
            0   12     1      volume  F
            0   12     2         pan  F
            1   12     3         vol  F
            2   12     4     panning  F
            3   12     5     volLeft  F
            4   12     6    volRight  F
    MethodParameters:
            Name  Flags
      audioTrack  
      volume      
      pan         

  private static final long clip(long, long, long);
    descriptor: (JJJ)J
    flags: (0x001a) ACC_PRIVATE, ACC_STATIC, ACC_FINAL
    Code:
      stack=4, locals=6, args_size=3
        start local 0 // long value
        start local 2 // long min
        start local 4 // long max
         0: .line 336
            lload 0 /* value */
            lload 2 /* min */
            lcmp
            ifge 1
            lload 2 /* min */
            goto 3
      StackMap locals:
      StackMap stack:
         1: lload 0 /* value */
            lload 4 /* max */
            lcmp
            ifge 2
            lload 0 /* value */
            goto 3
      StackMap locals:
      StackMap stack:
         2: lload 4 /* max */
      StackMap locals:
      StackMap stack: long
         3: lreturn
        end local 4 // long max
        end local 2 // long min
        end local 0 // long value
      LocalVariableTable:
        Start  End  Slot   Name  Signature
            0    4     0  value  J
            0    4     2    min  J
            0    4     4    max  J
    MethodParameters:
       Name  Flags
      value  
      min    
      max    

  private static final float clip(float, float, float);
    descriptor: (FFF)F
    flags: (0x001a) ACC_PRIVATE, ACC_STATIC, ACC_FINAL
    Code:
      stack=2, locals=3, args_size=3
        start local 0 // float value
        start local 1 // float min
        start local 2 // float max
         0: .line 340
            fload 0 /* value */
            fload 1 /* min */
            fcmpg
            ifge 1
            fload 1 /* min */
            goto 3
      StackMap locals:
      StackMap stack:
         1: fload 0 /* value */
            fload 2 /* max */
            fcmpg
            ifge 2
            fload 0 /* value */
            goto 3
      StackMap locals:
      StackMap stack:
         2: fload 2 /* max */
      StackMap locals:
      StackMap stack: float
         3: freturn
        end local 2 // float max
        end local 1 // float min
        end local 0 // float value
      LocalVariableTable:
        Start  End  Slot   Name  Signature
            0    4     0  value  F
            0    4     1    min  F
            0    4     2    max  F
    MethodParameters:
       Name  Flags
      value  
      min    
      max    

  public void setPlaybackPositionUpdateListener(android.media.AudioTrack$OnPlaybackPositionUpdateListener);
    descriptor: (Landroid/media/AudioTrack$OnPlaybackPositionUpdateListener;)V
    flags: (0x0001) ACC_PUBLIC
    Code:
      stack=2, locals=3, args_size=2
        start local 0 // android.speech.tts.BlockingAudioTrack this
        start local 1 // android.media.AudioTrack$OnPlaybackPositionUpdateListener listener
         0: .line 349
            aload 0 /* this */
            getfield android.speech.tts.BlockingAudioTrack.mAudioTrackLock:Ljava/lang/Object;
            dup
            astore 2
            monitorenter
         1: .line 350
            aload 0 /* this */
            getfield android.speech.tts.BlockingAudioTrack.mAudioTrack:Landroid/media/AudioTrack;
            ifnull 3
         2: .line 351
            aload 0 /* this */
            getfield android.speech.tts.BlockingAudioTrack.mAudioTrack:Landroid/media/AudioTrack;
            aload 1 /* listener */
            invokevirtual android.media.AudioTrack.setPlaybackPositionUpdateListener:(Landroid/media/AudioTrack$OnPlaybackPositionUpdateListener;)V
         3: .line 349
      StackMap locals: java.lang.Object
      StackMap stack:
            aload 2
            monitorexit
         4: goto 7
      StackMap locals:
      StackMap stack: java.lang.Throwable
         5: aload 2
            monitorexit
         6: athrow
         7: .line 354
      StackMap locals:
      StackMap stack:
            return
        end local 1 // android.media.AudioTrack$OnPlaybackPositionUpdateListener listener
        end local 0 // android.speech.tts.BlockingAudioTrack this
      LocalVariableTable:
        Start  End  Slot      Name  Signature
            0    8     0      this  Landroid/speech/tts/BlockingAudioTrack;
            0    8     1  listener  Landroid/media/AudioTrack$OnPlaybackPositionUpdateListener;
      Exception table:
        from    to  target  type
           1     4       5  any
           5     6       5  any
    MethodParameters:
          Name  Flags
      listener  

  public void setNotificationMarkerPosition(int);
    descriptor: (I)V
    flags: (0x0001) ACC_PUBLIC
    Code:
      stack=2, locals=3, args_size=2
        start local 0 // android.speech.tts.BlockingAudioTrack this
        start local 1 // int frames
         0: .line 358
            aload 0 /* this */
            getfield android.speech.tts.BlockingAudioTrack.mAudioTrackLock:Ljava/lang/Object;
            dup
            astore 2
            monitorenter
         1: .line 359
            aload 0 /* this */
            getfield android.speech.tts.BlockingAudioTrack.mAudioTrack:Landroid/media/AudioTrack;
            ifnull 3
         2: .line 360
            aload 0 /* this */
            getfield android.speech.tts.BlockingAudioTrack.mAudioTrack:Landroid/media/AudioTrack;
            iload 1 /* frames */
            invokevirtual android.media.AudioTrack.setNotificationMarkerPosition:(I)I
            pop
         3: .line 358
      StackMap locals: java.lang.Object
      StackMap stack:
            aload 2
            monitorexit
         4: goto 7
      StackMap locals:
      StackMap stack: java.lang.Throwable
         5: aload 2
            monitorexit
         6: athrow
         7: .line 363
      StackMap locals:
      StackMap stack:
            return
        end local 1 // int frames
        end local 0 // android.speech.tts.BlockingAudioTrack this
      LocalVariableTable:
        Start  End  Slot    Name  Signature
            0    8     0    this  Landroid/speech/tts/BlockingAudioTrack;
            0    8     1  frames  I
      Exception table:
        from    to  target  type
           1     4       5  any
           5     6       5  any
    MethodParameters:
        Name  Flags
      frames  
}
SourceFile: "BlockingAudioTrack.java"
InnerClasses:
  public Builder = android.media.AudioFormat$Builder of android.media.AudioFormat
  public abstract OnPlaybackPositionUpdateListener = android.media.AudioTrack$OnPlaybackPositionUpdateListener of android.media.AudioTrack
  AudioOutputParams = android.speech.tts.TextToSpeechService$AudioOutputParams of android.speech.tts.TextToSpeechService