Skip to content

Repository files navigation

RxAndroidAudio

Android Audio encapsulation library, with part Rx support.

DownloadBuild 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 = newFile(
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(newObserver<Boolean>() {
@OverridepublicvoidonSubscribe(finalDisposabledisposable) {
}
@OverridepublicvoidonNext(finalBooleanaBoolean) {
// prepared
}
@OverridepublicvoidonError(finalThrowablethrowable) {
}
@OverridepublicvoidonComplete() {
// 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 = newFile(Environment.getExternalStorageDirectory().getAbsolutePath() +
File.separator + System.nanoTime() + ".stream.m4a");
mOutputFile.createNewFile();
mFileOutputStream = newFileOutputStream(mOutputFile);
mStreamAudioRecorder.start(newStreamAudioRecorder.AudioDataCallback() {
@OverridepublicvoidonAudioData(byte[] data, intsize) {
if (mFileOutputStream != null) {
try {
mFileOutputStream.write(data, 0, size);
} catch (IOExceptione) {
e.printStackTrace();
}
}
}
@OverridepublicvoidonError() {
mBtnStart.post(newRunnable() {
@Overridepublicvoidrun() {
Toast.makeText(getApplicationContext(), "Record fail",
Toast.LENGTH_SHORT).show();
mBtnStart.setText("Start");
mIsRecording = false;
}
});
}
});

Play a stream

Observable.just(mOutputFile).subscribeOn(Schedulers.io()).subscribe(newAction1<File>() {
@Overridepublicvoidcall(Filefile) {
try {
mStreamAudioPlayer.init();
FileInputStreaminputStream = newFileInputStream(file);
intread;
while ((read = inputStream.read(mBuffer)) > 0) {
mStreamAudioPlayer.play(mBuffer, read);
}
inputStream.close();
mStreamAudioPlayer.release();
} catch (IOExceptione) {
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

About

Maybe the most robust Android Audio encapsulation library, with partial Rx support.

Resources

Stars

1.6k stars

Watchers

49 watching

Forks

Releases

Packages

Contributors

Languages