Maybe the most robust Android Audio encapsulation library, with partial Rx support.
Java C CMake
Clone or download
Latest commit a2c0941 May 28, 2018


Android Audio encapsulation library, with part Rx support.



About lambda support

This library use lambda expression, since, there is native support for lambda, so I use it instead of jack support or RetroLambda, if you have lambda issue during build, please upgrade your gradle-android into 2.4.0+, or use 1.5.1 of this library, thanks!

Add to gradle dependency of your module build.gradle:

allprojects {
    repositories {
        maven {
            url  ""

dependencies {
    compile 'com.github.piasy:rxandroidaudio:1.5.2'
    compile 'com.github.piasy:AudioProcessor:1.5.2'

Use in code:

Record to file:

mAudioRecorder = AudioRecorder.getInstance();
mAudioFile = new File(
        Environment.getExternalStorageDirectory().getAbsolutePath() +
                File.separator + System.nanoTime() + ".file.m4a");
        MediaRecorder.OutputFormat.MPEG_4, MediaRecorder.AudioEncoder.AAC,
// ...

Note: If you record a aac file, the sound quality will be poor if the sample rate and encoding bit rate is low, the sound quality will increase when you set a bigger sample rate and encoding bit rate, but as the sound quality improve, the recorded file size will also increase.

Play a file

With PlayConfig, to set audio file or audio resource, set volume, or looping:
        .subscribe(new Observer<Boolean>() {
               public void onSubscribe(final Disposable disposable) {


               public void onNext(final Boolean aBoolean) {
                    // prepared

               public void onError(final Throwable throwable) {


               public void onComplete() {
                    // play finished
                    // NOTE: if looping, the Observable will never finish, you need stop playing
                    // onDestroy, otherwise, memory leak will happen!

Full example of PlayConfig

PlayConfig.file(audioFile) // play a local file
    //.res(getApplicationContext(), R.raw.audio_record_end) // or play a raw resource
    .looping(true) // loop or not
    .leftVolume(1.0F) // left volume
    .rightVolume(1.0F) // right volume
    .build(); // build this config and play!

Record a stream:

mOutputFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath() +
        File.separator + System.nanoTime() + ".stream.m4a");
mFileOutputStream = new FileOutputStream(mOutputFile);
mStreamAudioRecorder.start(new StreamAudioRecorder.AudioDataCallback() {
    public void onAudioData(byte[] data, int size) {
        if (mFileOutputStream != null) {
            try {
                mFileOutputStream.write(data, 0, size);
            } catch (IOException e) {

    public void onError() { Runnable() {
            public void run() {
                Toast.makeText(getApplicationContext(), "Record fail",
                mIsRecording = false;

Play a stream:

Observable.just(mOutputFile).subscribeOn( Action1<File>() {
    public void call(File file) {
        try {
            FileInputStream inputStream = new FileInputStream(file);
            int read;
            while ((read = > 0) {
      , read);
        } catch (IOException e) {

Change the sound effect in stream mode:
    mAudioProcessor.process(mRatio, mBuffer, StreamAudioRecorder.DEFAULT_SAMPLE_RATE),

See full example for more details.

Download demo apk.

Contribution are welcome!