MCPcopy Index your code
hub / github.com/Piasy/RxAndroidAudio

github.com/Piasy/RxAndroidAudio @v1.7.0

Chat with this repo
repository ↗ · DeepWiki ↗ · release v1.7.0 ↗ · + Follow
101 symbols 245 edges 11 files 16 documented · 16% updated 5y ago★ 1,56111 open issues
What it actually does AI analysis from the code graph — generated when you open this
loading…
README

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

Extension points exported contracts — how you extend this code

OnErrorListener (Interface)
(no doc) [3 implementers]
rxandroidaudio/src/main/java/com/github/piasy/rxandroidaudio/AudioRecorder.java
AudioDataCallback (Interface)
Although Android frameworks jni implementation are the same for ENCODING_PCM_16BIT and ENCODING_PCM_8BIT, the Java doc d [1 …
rxandroidaudio/src/main/java/com/github/piasy/rxandroidaudio/StreamAudioRecorder.java

Core symbols most depended-on inside this repo

release
called by 10
rxandroidaudio/src/main/java/com/github/piasy/rxandroidaudio/StreamAudioPlayer.java
stopPlay
called by 9
rxandroidaudio/src/main/java/com/github/piasy/rxandroidaudio/RxAudioPlayer.java
create
called by 5
rxandroidaudio/src/main/java/com/github/piasy/rxandroidaudio/RxAudioPlayer.java
setError
called by 5
rxandroidaudio/src/main/java/com/github/piasy/rxandroidaudio/AudioRecorder.java
start
called by 5
rxandroidaudio/src/main/java/com/github/piasy/rxandroidaudio/StreamAudioRecorder.java
prepare
called by 4
rxandroidaudio/src/main/java/com/github/piasy/rxandroidaudio/RxAudioPlayer.java
setOnErrorListener
called by 4
rxandroidaudio/src/main/java/com/github/piasy/rxandroidaudio/AudioRecorder.java
stop
called by 4
rxandroidaudio/src/main/java/com/github/piasy/rxandroidaudio/StreamAudioRecorder.java

Shape

Method 80
Class 16
Function 3
Interface 2

Languages

Java97%
C3%

Modules by API surface

rxandroidaudio/src/main/java/com/github/piasy/rxandroidaudio/PlayConfig.java15 symbols
rxandroidaudio/src/main/java/com/github/piasy/rxandroidaudio/StreamAudioRecorder.java14 symbols
rxandroidaudio/src/main/java/com/github/piasy/rxandroidaudio/RxAudioPlayer.java14 symbols
rxandroidaudio/src/main/java/com/github/piasy/rxandroidaudio/AudioRecorder.java14 symbols
app/src/main/java/com/github/piasy/rxandroidaudio/example/StreamActivity.java14 symbols
app/src/main/java/com/github/piasy/rxandroidaudio/example/FileActivity.java9 symbols
rxandroidaudio/src/main/java/com/github/piasy/rxandroidaudio/StreamAudioPlayer.java7 symbols
rxandroidaudio/src/main/java/com/github/piasy/rxandroidaudio/RxAmplitude.java4 symbols
app/src/main/java/com/github/piasy/rxandroidaudio/example/MainActivity.java4 symbols
AudioProcessor/src/main/java/com/github/piasy/audioprocessor/AudioProcessor.java3 symbols
AudioProcessor/src/main/cpp/smbPitchShift.c3 symbols

For agents

$ claude mcp add RxAndroidAudio \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact

Ask about this repo answers extend the page