rxandroidaudio

Android Audio encapsulation library, with part Rx support.

License

License

GroupId

GroupId

com.github.piasy
ArtifactId

ArtifactId

rxandroidaudio
Last Version

Last Version

1.7.0
Release Date

Release Date

Type

Type

aar
Description

Description

rxandroidaudio
Android Audio encapsulation library, with part Rx support.
Project URL

Project URL

https://github.com/Piasy/RxAndroidAudio
Source Code Management

Source Code Management

https://github.com/Piasy/RxAndroidAudio

Download rxandroidaudio

How to add to project

<!-- https://jarcasting.com/artifacts/com.github.piasy/rxandroidaudio/ -->
<dependency>
    <groupId>com.github.piasy</groupId>
    <artifactId>rxandroidaudio</artifactId>
    <version>1.7.0</version>
    <type>aar</type>
</dependency>
// https://jarcasting.com/artifacts/com.github.piasy/rxandroidaudio/
implementation 'com.github.piasy:rxandroidaudio:1.7.0'
// https://jarcasting.com/artifacts/com.github.piasy/rxandroidaudio/
implementation ("com.github.piasy:rxandroidaudio:1.7.0")
'com.github.piasy:rxandroidaudio:aar:1.7.0'
<dependency org="com.github.piasy" name="rxandroidaudio" rev="1.7.0">
  <artifact name="rxandroidaudio" type="aar" />
</dependency>
@Grapes(
@Grab(group='com.github.piasy', module='rxandroidaudio', version='1.7.0')
)
libraryDependencies += "com.github.piasy" % "rxandroidaudio" % "1.7.0"
[com.github.piasy/rxandroidaudio "1.7.0"]

Dependencies

compile (2)

Group / Artifact Type Version
androidx.annotation » annotation jar 1.0.0
io.reactivex.rxjava2 : rxjava jar 2.2.4

Project Modules

There are no modules declared in this project.

RxAndroidAudio

Android Audio encapsulation library, with part Rx support.

Download Build Status

Usage

About lambda support

This library use lambda expression, since com.android.tools.build:gradle:2.4.0, 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 {
        mavenCentral()
    }
}

dependencies {
    implementation 'com.github.piasy:rxandroidaudio:1.7.0'
    implementation 'com.github.piasy:AudioProcessor:1.7.0'
}

Use in code

Record to file

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

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:

mRxAudioPlayer.play(PlayConfig.file(audioFile).looping(true).build())
        .subscribeOn(Schedulers.io())
        .subscribe(new Observer<Boolean>() {
               @Override
               public void onSubscribe(final Disposable disposable) {

               }

               @Override
               public void onNext(final Boolean aBoolean) {
                    // prepared
               }

               @Override
               public void onError(final Throwable throwable) {

               }

               @Override
               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");
mOutputFile.createNewFile();
mFileOutputStream = new FileOutputStream(mOutputFile);
mStreamAudioRecorder.start(new StreamAudioRecorder.AudioDataCallback() {
    @Override
    public void onAudioData(byte[] data, int size) {
        if (mFileOutputStream != null) {
            try {
                mFileOutputStream.write(data, 0, size);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    @Override
    public void onError() {
        mBtnStart.post(new Runnable() {
            @Override
            public void run() {
                Toast.makeText(getApplicationContext(), "Record fail",
                        Toast.LENGTH_SHORT).show();
                mBtnStart.setText("Start");
                mIsRecording = false;
            }
        });
    }
});

Play a stream

Observable.just(mOutputFile).subscribeOn(Schedulers.io()).subscribe(new Action1<File>() {
    @Override
    public void call(File file) {
        try {
            mStreamAudioPlayer.init();
            FileInputStream inputStream = new FileInputStream(file);
            int read;
            while ((read = inputStream.read(mBuffer)) > 0) {
                mStreamAudioPlayer.play(mBuffer, read);
            }
            inputStream.close();
            mStreamAudioPlayer.release();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
});

Change the sound effect in stream mode

mStreamAudioPlayer.play(
    mAudioProcessor.process(mRatio, mBuffer, StreamAudioRecorder.DEFAULT_SAMPLE_RATE),
    len);

See full example for more details.

Download demo apk.

Contribution are welcome

Versions

Version
1.7.0