# Audio extension (/en/realtime-media/marketplace/build/build-your-own-extension/audio-filter/android)

> For AI agents: see the complete documentation index at [llms.txt](/llms.txt).

The audio filters you create are easily integrated into apps to supply voice effects and noise cancellation.

      
## Understand the tech

An audio filter accesses voice data when it is captured from the user's local device, modifies it, then plays the updated data to local and remote video channels.

![Audio extension pipeline](https://assets-docs.agora.io/images/video-sdk/extension-audio-filter.png)

A typical transmission pipeline consists of a chain of procedures, including capture, pre-processing, encoding, transmitting, decoding, post-processing, and playback. To modify the voice or video data in the transmission pipeline, audio extensions are inserted into either the pre-processing or post-processing stage.

## Prerequisites

* Android Studio 4.1 or higher.
* Android SDK API Level 24 or higher.
* A mobile device that runs Android 4.1 or higher.
* A project to develop in.

## Project setup

In order to integrate an extension into your project:

* Follow the SDK setup flow in [Quickstart - integrate an extension](../../quickstart-integrate.mdx).
* Prepare the Android project structure and Gradle dependencies required for the extension package.

You are now ready to develop your extension.

## Create an audio extension

After encapsulating the filter into an extension, you need to register and package it into a `.aar` or `.so` file, and submit it together with a file that contains the extension name, vendor name, and filter name to Agora.

### Package the extension

1. Register the extension.

   Register the extension with the `REGISTER_AGORA_EXTENSION_PROVIDER` macro in `AgoraExtensionProviderEntry.h`. Use this macro at the entrance of the extension implementation. When the SDK loads the extension, this macro automatically registers it to the SDK. For example:

   ```cpp
   REGISTER_AGORA_EXTENSION_PROVIDER(ByteDance, agora::extension::ExtensionProvider);
   ```

2. Link the `libagora-rtc-sdk-jni.so` file.

   In `CMakeLists.txt`, specify the path to save the `libagora-rtc-sdk-jni.so` file in the downloaded SDK package according to the following table:

   | File                             | Path                                                                     |
   | -------------------------------- | ------------------------------------------------------------------------ |
   | 64-bit `libagora-rtc-sdk-jni.so` | `AgoraWithByteDanceAndroid/agora-bytedance/src/main/agoraLibs/arm64-v8a` |
   | 32-bit `libagora-rtc-sdk-jni.so` | `AgoraWithByteDanceAndroid/agora-bytedance/src/main/agoraLibs/arm64-v7a` |

3. Provide extension information.

   Create a `.java` or `.md` file to provide the following information:

   * `EXTENSION_NAME`: The name of the target link library used in `CMakeLists.txt`. For example, for a `.so` file named `libagora-bytedance.so`, the `EXTENSION_NAME` should be `agora-bytedance`.
   * `EXTENSION_VENDOR_NAME`: The name of the extension provider, which is used for registering in the `agora-bytedance.cpp` file.
   * `EXTENSION_FILTER_NAME`: The name of the filter, which is defined in `ExtensionProvider.h`.

## Test your implementation

Once you have developed your extension and API endpoints, the next step is to test whether they work properly.

* Run functional and performance tests.
  Your test report must contain:
  * Proof that the extension is enabled and loaded in the SDK normally.
  * Verification that all key-value pairs in `setExtensionProperty` work properly.
  * Verification that all event callbacks of your extension work properly through `IMediaExtensionObserver`.
  * Performance data such as average per-frame processing time, peak memory usage, and peak CPU/GPU usage.
* Run an extension listing test.
  Verify the extension listing in the Marketplace test environment, including activation, deactivation, and the linked documentation.
* Write the integration document for your extension.
  Follow [Integration guide for your extension](../implementation-guide.md) to prepare the public integration document.
* Apply for testing.
  Contact Agora and provide your extension package, extension listing assets, company name, public email, Provisioning API endpoints, Usage and Billing API endpoints, pricing model, support page URL, website URL, and implementation guide URL.
* Test your extension listing after Agora enables the test environment.

You are then ready to [Publish your extension](../publish-extension.md).

## Reference

* [RtcEngineConfig.addExtension](/en/api-reference/rtc/android/class-and-enum/classes/class-rtcengineconfig)
* [enableExtension](/en/api-reference/rtc/android/video/pre-and-post-processing/extensions)
* [setExtensionProperty](/en/api-reference/rtc/android/video/pre-and-post-processing/extensions)
* [IMediaExtensionObserver](/en/api-reference/rtc/android/class-and-enum/interfaces/class-imediaextensionobserver)

    
  
      
  
      
  
      
  
      
  
      
  
      
  
      
  
      
  
