diff --git a/Android.bp b/Android.bp
index 4766b71..fd138b0 100644
--- a/Android.bp
+++ b/Android.bp
@@ -3,13 +3,11 @@
 cc_library_headers {
     name: "libhardware_headers",
     header_libs: [
-        "libaudio_system_headers",
         "libsystem_headers",
         "libcutils_headers",
         "libbluetooth-types-header",
     ],
     export_header_lib_headers: [
-        "libaudio_system_headers",
         "libsystem_headers",
         "libcutils_headers",
         "libbluetooth-types-header",
diff --git a/include/hardware/audio.h b/include/hardware/audio.h
deleted file mode 100644
index 2d6eb30..0000000
--- a/include/hardware/audio.h
+++ /dev/null
@@ -1,745 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-#ifndef ANDROID_AUDIO_HAL_INTERFACE_H
-#define ANDROID_AUDIO_HAL_INTERFACE_H
-
-#include <stdint.h>
-#include <strings.h>
-#include <sys/cdefs.h>
-#include <sys/types.h>
-#include <time.h>
-
-#include <cutils/bitops.h>
-
-#include <hardware/hardware.h>
-#include <system/audio.h>
-#include <hardware/audio_effect.h>
-
-__BEGIN_DECLS
-
-/**
- * The id of this module
- */
-#define AUDIO_HARDWARE_MODULE_ID "audio"
-
-/**
- * Name of the audio devices to open
- */
-#define AUDIO_HARDWARE_INTERFACE "audio_hw_if"
-
-
-/* Use version 0.1 to be compatible with first generation of audio hw module with version_major
- * hardcoded to 1. No audio module API change.
- */
-#define AUDIO_MODULE_API_VERSION_0_1 HARDWARE_MODULE_API_VERSION(0, 1)
-#define AUDIO_MODULE_API_VERSION_CURRENT AUDIO_MODULE_API_VERSION_0_1
-
-/* First generation of audio devices had version hardcoded to 0. all devices with versions < 1.0
- * will be considered of first generation API.
- */
-#define AUDIO_DEVICE_API_VERSION_0_0 HARDWARE_DEVICE_API_VERSION(0, 0)
-#define AUDIO_DEVICE_API_VERSION_1_0 HARDWARE_DEVICE_API_VERSION(1, 0)
-#define AUDIO_DEVICE_API_VERSION_2_0 HARDWARE_DEVICE_API_VERSION(2, 0)
-#define AUDIO_DEVICE_API_VERSION_3_0 HARDWARE_DEVICE_API_VERSION(3, 0)
-#define AUDIO_DEVICE_API_VERSION_CURRENT AUDIO_DEVICE_API_VERSION_3_0
-/* Minimal audio HAL version supported by the audio framework */
-#define AUDIO_DEVICE_API_VERSION_MIN AUDIO_DEVICE_API_VERSION_2_0
-
-/**************************************/
-
-/**
- *  standard audio parameters that the HAL may need to handle
- */
-
-/**
- *  audio device parameters
- */
-
-/* TTY mode selection */
-#define AUDIO_PARAMETER_KEY_TTY_MODE "tty_mode"
-#define AUDIO_PARAMETER_VALUE_TTY_OFF "tty_off"
-#define AUDIO_PARAMETER_VALUE_TTY_VCO "tty_vco"
-#define AUDIO_PARAMETER_VALUE_TTY_HCO "tty_hco"
-#define AUDIO_PARAMETER_VALUE_TTY_FULL "tty_full"
-
-/* Hearing Aid Compatibility - Telecoil (HAC-T) mode on/off */
-#define AUDIO_PARAMETER_KEY_HAC "HACSetting"
-#define AUDIO_PARAMETER_VALUE_HAC_ON "ON"
-#define AUDIO_PARAMETER_VALUE_HAC_OFF "OFF"
-
-/* A2DP sink address set by framework */
-#define AUDIO_PARAMETER_A2DP_SINK_ADDRESS "a2dp_sink_address"
-
-/* A2DP source address set by framework */
-#define AUDIO_PARAMETER_A2DP_SOURCE_ADDRESS "a2dp_source_address"
-
-/* Bluetooth SCO wideband */
-#define AUDIO_PARAMETER_KEY_BT_SCO_WB "bt_wbs"
-
-/**
- *  audio stream parameters
- */
-
-/* Enable AANC */
-#define AUDIO_PARAMETER_KEY_AANC "aanc_enabled"
-
-/**************************************/
-
-/* common audio stream parameters and operations */
-struct audio_stream {
-
-    /**
-     * Return the sampling rate in Hz - eg. 44100.
-     */
-    uint32_t (*get_sample_rate)(const struct audio_stream *stream);
-
-    /* currently unused - use set_parameters with key
-     *    AUDIO_PARAMETER_STREAM_SAMPLING_RATE
-     */
-    int (*set_sample_rate)(struct audio_stream *stream, uint32_t rate);
-
-    /**
-     * Return size of input/output buffer in bytes for this stream - eg. 4800.
-     * It should be a multiple of the frame size.  See also get_input_buffer_size.
-     */
-    size_t (*get_buffer_size)(const struct audio_stream *stream);
-
-    /**
-     * Return the channel mask -
-     *  e.g. AUDIO_CHANNEL_OUT_STEREO or AUDIO_CHANNEL_IN_STEREO
-     */
-    audio_channel_mask_t (*get_channels)(const struct audio_stream *stream);
-
-    /**
-     * Return the audio format - e.g. AUDIO_FORMAT_PCM_16_BIT
-     */
-    audio_format_t (*get_format)(const struct audio_stream *stream);
-
-    /* currently unused - use set_parameters with key
-     *     AUDIO_PARAMETER_STREAM_FORMAT
-     */
-    int (*set_format)(struct audio_stream *stream, audio_format_t format);
-
-    /**
-     * Put the audio hardware input/output into standby mode.
-     * Driver should exit from standby mode at the next I/O operation.
-     * Returns 0 on success and <0 on failure.
-     */
-    int (*standby)(struct audio_stream *stream);
-
-    /** dump the state of the audio input/output device */
-    int (*dump)(const struct audio_stream *stream, int fd);
-
-    /** Return the set of device(s) which this stream is connected to */
-    audio_devices_t (*get_device)(const struct audio_stream *stream);
-
-    /**
-     * Currently unused - set_device() corresponds to set_parameters() with key
-     * AUDIO_PARAMETER_STREAM_ROUTING for both input and output.
-     * AUDIO_PARAMETER_STREAM_INPUT_SOURCE is an additional information used by
-     * input streams only.
-     */
-    int (*set_device)(struct audio_stream *stream, audio_devices_t device);
-
-    /**
-     * set/get audio stream parameters. The function accepts a list of
-     * parameter key value pairs in the form: key1=value1;key2=value2;...
-     *
-     * Some keys are reserved for standard parameters (See AudioParameter class)
-     *
-     * If the implementation does not accept a parameter change while
-     * the output is active but the parameter is acceptable otherwise, it must
-     * return -ENOSYS.
-     *
-     * The audio flinger will put the stream in standby and then change the
-     * parameter value.
-     */
-    int (*set_parameters)(struct audio_stream *stream, const char *kv_pairs);
-
-    /*
-     * Returns a pointer to a heap allocated string. The caller is responsible
-     * for freeing the memory for it using free().
-     */
-    char * (*get_parameters)(const struct audio_stream *stream,
-                             const char *keys);
-    int (*add_audio_effect)(const struct audio_stream *stream,
-                             effect_handle_t effect);
-    int (*remove_audio_effect)(const struct audio_stream *stream,
-                             effect_handle_t effect);
-};
-typedef struct audio_stream audio_stream_t;
-
-/* type of asynchronous write callback events. Mutually exclusive */
-typedef enum {
-    STREAM_CBK_EVENT_WRITE_READY, /* non blocking write completed */
-    STREAM_CBK_EVENT_DRAIN_READY,  /* drain completed */
-    STREAM_CBK_EVENT_ERROR, /* stream hit some error, let AF take action */
-} stream_callback_event_t;
-
-typedef int (*stream_callback_t)(stream_callback_event_t event, void *param, void *cookie);
-
-/* type of drain requested to audio_stream_out->drain(). Mutually exclusive */
-typedef enum {
-    AUDIO_DRAIN_ALL,            /* drain() returns when all data has been played */
-    AUDIO_DRAIN_EARLY_NOTIFY    /* drain() returns a short time before all data
-                                   from the current track has been played to
-                                   give time for gapless track switch */
-} audio_drain_type_t;
-
-/**
- * audio_stream_out is the abstraction interface for the audio output hardware.
- *
- * It provides information about various properties of the audio output
- * hardware driver.
- */
-
-struct audio_stream_out {
-    /**
-     * Common methods of the audio stream out.  This *must* be the first member of audio_stream_out
-     * as users of this structure will cast a audio_stream to audio_stream_out pointer in contexts
-     * where it's known the audio_stream references an audio_stream_out.
-     */
-    struct audio_stream common;
-
-    /**
-     * Return the audio hardware driver estimated latency in milliseconds.
-     */
-    uint32_t (*get_latency)(const struct audio_stream_out *stream);
-
-    /**
-     * Use this method in situations where audio mixing is done in the
-     * hardware. This method serves as a direct interface with hardware,
-     * allowing you to directly set the volume as apposed to via the framework.
-     * This method might produce multiple PCM outputs or hardware accelerated
-     * codecs, such as MP3 or AAC.
-     */
-    int (*set_volume)(struct audio_stream_out *stream, float left, float right);
-
-    /**
-     * Write audio buffer to driver. Returns number of bytes written, or a
-     * negative status_t. If at least one frame was written successfully prior to the error,
-     * it is suggested that the driver return that successful (short) byte count
-     * and then return an error in the subsequent call.
-     *
-     * If set_callback() has previously been called to enable non-blocking mode
-     * the write() is not allowed to block. It must write only the number of
-     * bytes that currently fit in the driver/hardware buffer and then return
-     * this byte count. If this is less than the requested write size the
-     * callback function must be called when more space is available in the
-     * driver/hardware buffer.
-     */
-    ssize_t (*write)(struct audio_stream_out *stream, const void* buffer,
-                     size_t bytes);
-
-    /* return the number of audio frames written by the audio dsp to DAC since
-     * the output has exited standby
-     */
-    int (*get_render_position)(const struct audio_stream_out *stream,
-                               uint32_t *dsp_frames);
-
-    /**
-     * get the local time at which the next write to the audio driver will be presented.
-     * The units are microseconds, where the epoch is decided by the local audio HAL.
-     */
-    int (*get_next_write_timestamp)(const struct audio_stream_out *stream,
-                                    int64_t *timestamp);
-
-    /**
-     * set the callback function for notifying completion of non-blocking
-     * write and drain.
-     * Calling this function implies that all future write() and drain()
-     * must be non-blocking and use the callback to signal completion.
-     */
-    int (*set_callback)(struct audio_stream_out *stream,
-            stream_callback_t callback, void *cookie);
-
-    /**
-     * Notifies to the audio driver to stop playback however the queued buffers are
-     * retained by the hardware. Useful for implementing pause/resume. Empty implementation
-     * if not supported however should be implemented for hardware with non-trivial
-     * latency. In the pause state audio hardware could still be using power. User may
-     * consider calling suspend after a timeout.
-     *
-     * Implementation of this function is mandatory for offloaded playback.
-     */
-    int (*pause)(struct audio_stream_out* stream);
-
-    /**
-     * Notifies to the audio driver to resume playback following a pause.
-     * Returns error if called without matching pause.
-     *
-     * Implementation of this function is mandatory for offloaded playback.
-     */
-    int (*resume)(struct audio_stream_out* stream);
-
-    /**
-     * Requests notification when data buffered by the driver/hardware has
-     * been played. If set_callback() has previously been called to enable
-     * non-blocking mode, the drain() must not block, instead it should return
-     * quickly and completion of the drain is notified through the callback.
-     * If set_callback() has not been called, the drain() must block until
-     * completion.
-     * If type==AUDIO_DRAIN_ALL, the drain completes when all previously written
-     * data has been played.
-     * If type==AUDIO_DRAIN_EARLY_NOTIFY, the drain completes shortly before all
-     * data for the current track has played to allow time for the framework
-     * to perform a gapless track switch.
-     *
-     * Drain must return immediately on stop() and flush() call
-     *
-     * Implementation of this function is mandatory for offloaded playback.
-     */
-    int (*drain)(struct audio_stream_out* stream, audio_drain_type_t type );
-
-    /**
-     * Notifies to the audio driver to flush the queued data. Stream must already
-     * be paused before calling flush().
-     *
-     * Implementation of this function is mandatory for offloaded playback.
-     */
-   int (*flush)(struct audio_stream_out* stream);
-
-    /**
-     * Return a recent count of the number of audio frames presented to an external observer.
-     * This excludes frames which have been written but are still in the pipeline.
-     * The count is not reset to zero when output enters standby.
-     * Also returns the value of CLOCK_MONOTONIC as of this presentation count.
-     * The returned count is expected to be 'recent',
-     * but does not need to be the most recent possible value.
-     * However, the associated time should correspond to whatever count is returned.
-     * Example:  assume that N+M frames have been presented, where M is a 'small' number.
-     * Then it is permissible to return N instead of N+M,
-     * and the timestamp should correspond to N rather than N+M.
-     * The terms 'recent' and 'small' are not defined.
-     * They reflect the quality of the implementation.
-     *
-     * 3.0 and higher only.
-     */
-    int (*get_presentation_position)(const struct audio_stream_out *stream,
-                               uint64_t *frames, struct timespec *timestamp);
-
-    /**
-     * Called by the framework to start a stream operating in mmap mode.
-     * create_mmap_buffer must be called before calling start()
-     *
-     * \note Function only implemented by streams operating in mmap mode.
-     *
-     * \param[in] stream the stream object.
-     * \return 0 in case of success.
-     *         -ENOSYS if called out of sequence or on non mmap stream
-     */
-    int (*start)(const struct audio_stream_out* stream);
-
-    /**
-     * Called by the framework to stop a stream operating in mmap mode.
-     * Must be called after start()
-     *
-     * \note Function only implemented by streams operating in mmap mode.
-     *
-     * \param[in] stream the stream object.
-     * \return 0 in case of success.
-     *         -ENOSYS if called out of sequence or on non mmap stream
-     */
-    int (*stop)(const struct audio_stream_out* stream);
-
-    /**
-     * Called by the framework to retrieve information on the mmap buffer used for audio
-     * samples transfer.
-     *
-     * \note Function only implemented by streams operating in mmap mode.
-     *
-     * \param[in] stream the stream object.
-     * \param[in] min_size_frames minimum buffer size requested. The actual buffer
-     *        size returned in struct audio_mmap_buffer_info can be larger.
-     * \param[out] info address at which the mmap buffer information should be returned.
-     *
-     * \return 0 if the buffer was allocated.
-     *         -ENODEV in case of initialization error
-     *         -EINVAL if the requested buffer size is too large
-     *         -ENOSYS if called out of sequence (e.g. buffer already allocated)
-     */
-    int (*create_mmap_buffer)(const struct audio_stream_out *stream,
-                              int32_t min_size_frames,
-                              struct audio_mmap_buffer_info *info);
-
-    /**
-     * Called by the framework to read current read/write position in the mmap buffer
-     * with associated time stamp.
-     *
-     * \note Function only implemented by streams operating in mmap mode.
-     *
-     * \param[in] stream the stream object.
-     * \param[out] position address at which the mmap read/write position should be returned.
-     *
-     * \return 0 if the position is successfully returned.
-     *         -ENODATA if the position cannot be retrieved
-     *         -ENOSYS if called before create_mmap_buffer()
-     */
-    int (*get_mmap_position)(const struct audio_stream_out *stream,
-                             struct audio_mmap_position *position);
-};
-typedef struct audio_stream_out audio_stream_out_t;
-
-struct audio_stream_in {
-    /**
-     * Common methods of the audio stream in.  This *must* be the first member of audio_stream_in
-     * as users of this structure will cast a audio_stream to audio_stream_in pointer in contexts
-     * where it's known the audio_stream references an audio_stream_in.
-     */
-    struct audio_stream common;
-
-    /** set the input gain for the audio driver. This method is for
-     *  for future use */
-    int (*set_gain)(struct audio_stream_in *stream, float gain);
-
-    /** Read audio buffer in from audio driver. Returns number of bytes read, or a
-     *  negative status_t. If at least one frame was read prior to the error,
-     *  read should return that byte count and then return an error in the subsequent call.
-     */
-    ssize_t (*read)(struct audio_stream_in *stream, void* buffer,
-                    size_t bytes);
-
-    /**
-     * Return the amount of input frames lost in the audio driver since the
-     * last call of this function.
-     * Audio driver is expected to reset the value to 0 and restart counting
-     * upon returning the current value by this function call.
-     * Such loss typically occurs when the user space process is blocked
-     * longer than the capacity of audio driver buffers.
-     *
-     * Unit: the number of input audio frames
-     */
-    uint32_t (*get_input_frames_lost)(struct audio_stream_in *stream);
-
-    /**
-     * Return a recent count of the number of audio frames received and
-     * the clock time associated with that frame count.
-     *
-     * frames is the total frame count received. This should be as early in
-     *     the capture pipeline as possible. In general,
-     *     frames should be non-negative and should not go "backwards".
-     *
-     * time is the clock MONOTONIC time when frames was measured. In general,
-     *     time should be a positive quantity and should not go "backwards".
-     *
-     * The status returned is 0 on success, -ENOSYS if the device is not
-     * ready/available, or -EINVAL if the arguments are null or otherwise invalid.
-     */
-    int (*get_capture_position)(const struct audio_stream_in *stream,
-                                int64_t *frames, int64_t *time);
-
-    /**
-     * Called by the framework to start a stream operating in mmap mode.
-     * create_mmap_buffer must be called before calling start()
-     *
-     * \note Function only implemented by streams operating in mmap mode.
-     *
-     * \param[in] stream the stream object.
-     * \return 0 in case off success.
-     *         -ENOSYS if called out of sequence or on non mmap stream
-     */
-    int (*start)(const struct audio_stream_in* stream);
-
-    /**
-     * Called by the framework to stop a stream operating in mmap mode.
-     *
-     * \note Function only implemented by streams operating in mmap mode.
-     *
-     * \param[in] stream the stream object.
-     * \return 0 in case of success.
-     *         -ENOSYS if called out of sequence or on non mmap stream
-     */
-    int (*stop)(const struct audio_stream_in* stream);
-
-    /**
-     * Called by the framework to retrieve information on the mmap buffer used for audio
-     * samples transfer.
-     *
-     * \note Function only implemented by streams operating in mmap mode.
-     *
-     * \param[in] stream the stream object.
-     * \param[in] min_size_frames minimum buffer size requested. The actual buffer
-     *        size returned in struct audio_mmap_buffer_info can be larger.
-     * \param[out] info address at which the mmap buffer information should be returned.
-     *
-     * \return 0 if the buffer was allocated.
-     *         -ENODEV in case of initialization error
-     *         -EINVAL if the requested buffer size is too large
-     *         -ENOSYS if called out of sequence (e.g. buffer already allocated)
-     */
-    int (*create_mmap_buffer)(const struct audio_stream_in *stream,
-                              int32_t min_size_frames,
-                              struct audio_mmap_buffer_info *info);
-
-    /**
-     * Called by the framework to read current read/write position in the mmap buffer
-     * with associated time stamp.
-     *
-     * \note Function only implemented by streams operating in mmap mode.
-     *
-     * \param[in] stream the stream object.
-     * \param[out] position address at which the mmap read/write position should be returned.
-     *
-     * \return 0 if the position is successfully returned.
-     *         -ENODATA if the position cannot be retreived
-     *         -ENOSYS if called before mmap_read_position()
-     */
-    int (*get_mmap_position)(const struct audio_stream_in *stream,
-                             struct audio_mmap_position *position);
-};
-typedef struct audio_stream_in audio_stream_in_t;
-
-/**
- * return the frame size (number of bytes per sample).
- *
- * Deprecated: use audio_stream_out_frame_size() or audio_stream_in_frame_size() instead.
- */
-__attribute__((__deprecated__))
-static inline size_t audio_stream_frame_size(const struct audio_stream *s)
-{
-    size_t chan_samp_sz;
-    audio_format_t format = s->get_format(s);
-
-    if (audio_has_proportional_frames(format)) {
-        chan_samp_sz = audio_bytes_per_sample(format);
-        return popcount(s->get_channels(s)) * chan_samp_sz;
-    }
-
-    return sizeof(int8_t);
-}
-
-/**
- * return the frame size (number of bytes per sample) of an output stream.
- */
-static inline size_t audio_stream_out_frame_size(const struct audio_stream_out *s)
-{
-    size_t chan_samp_sz;
-    audio_format_t format = s->common.get_format(&s->common);
-
-    if (audio_has_proportional_frames(format)) {
-        chan_samp_sz = audio_bytes_per_sample(format);
-        return audio_channel_count_from_out_mask(s->common.get_channels(&s->common)) * chan_samp_sz;
-    }
-
-    return sizeof(int8_t);
-}
-
-/**
- * return the frame size (number of bytes per sample) of an input stream.
- */
-static inline size_t audio_stream_in_frame_size(const struct audio_stream_in *s)
-{
-    size_t chan_samp_sz;
-    audio_format_t format = s->common.get_format(&s->common);
-
-    if (audio_has_proportional_frames(format)) {
-        chan_samp_sz = audio_bytes_per_sample(format);
-        return audio_channel_count_from_in_mask(s->common.get_channels(&s->common)) * chan_samp_sz;
-    }
-
-    return sizeof(int8_t);
-}
-
-/**********************************************************************/
-
-/**
- * Every hardware module must have a data structure named HAL_MODULE_INFO_SYM
- * and the fields of this data structure must begin with hw_module_t
- * followed by module specific information.
- */
-struct audio_module {
-    struct hw_module_t common;
-};
-
-struct audio_hw_device {
-    /**
-     * Common methods of the audio device.  This *must* be the first member of audio_hw_device
-     * as users of this structure will cast a hw_device_t to audio_hw_device pointer in contexts
-     * where it's known the hw_device_t references an audio_hw_device.
-     */
-    struct hw_device_t common;
-
-    /**
-     * used by audio flinger to enumerate what devices are supported by
-     * each audio_hw_device implementation.
-     *
-     * Return value is a bitmask of 1 or more values of audio_devices_t
-     *
-     * NOTE: audio HAL implementations starting with
-     * AUDIO_DEVICE_API_VERSION_2_0 do not implement this function.
-     * All supported devices should be listed in audio_policy.conf
-     * file and the audio policy manager must choose the appropriate
-     * audio module based on information in this file.
-     */
-    uint32_t (*get_supported_devices)(const struct audio_hw_device *dev);
-
-    /**
-     * check to see if the audio hardware interface has been initialized.
-     * returns 0 on success, -ENODEV on failure.
-     */
-    int (*init_check)(const struct audio_hw_device *dev);
-
-    /** set the audio volume of a voice call. Range is between 0.0 and 1.0 */
-    int (*set_voice_volume)(struct audio_hw_device *dev, float volume);
-
-    /**
-     * set the audio volume for all audio activities other than voice call.
-     * Range between 0.0 and 1.0. If any value other than 0 is returned,
-     * the software mixer will emulate this capability.
-     */
-    int (*set_master_volume)(struct audio_hw_device *dev, float volume);
-
-    /**
-     * Get the current master volume value for the HAL, if the HAL supports
-     * master volume control.  AudioFlinger will query this value from the
-     * primary audio HAL when the service starts and use the value for setting
-     * the initial master volume across all HALs.  HALs which do not support
-     * this method may leave it set to NULL.
-     */
-    int (*get_master_volume)(struct audio_hw_device *dev, float *volume);
-
-    /**
-     * set_mode is called when the audio mode changes. AUDIO_MODE_NORMAL mode
-     * is for standard audio playback, AUDIO_MODE_RINGTONE when a ringtone is
-     * playing, and AUDIO_MODE_IN_CALL when a call is in progress.
-     */
-    int (*set_mode)(struct audio_hw_device *dev, audio_mode_t mode);
-
-    /* mic mute */
-    int (*set_mic_mute)(struct audio_hw_device *dev, bool state);
-    int (*get_mic_mute)(const struct audio_hw_device *dev, bool *state);
-
-    /* set/get global audio parameters */
-    int (*set_parameters)(struct audio_hw_device *dev, const char *kv_pairs);
-
-    /*
-     * Returns a pointer to a heap allocated string. The caller is responsible
-     * for freeing the memory for it using free().
-     */
-    char * (*get_parameters)(const struct audio_hw_device *dev,
-                             const char *keys);
-
-    /* Returns audio input buffer size according to parameters passed or
-     * 0 if one of the parameters is not supported.
-     * See also get_buffer_size which is for a particular stream.
-     */
-    size_t (*get_input_buffer_size)(const struct audio_hw_device *dev,
-                                    const struct audio_config *config);
-
-    /** This method creates and opens the audio hardware output stream.
-     * The "address" parameter qualifies the "devices" audio device type if needed.
-     * The format format depends on the device type:
-     * - Bluetooth devices use the MAC address of the device in the form "00:11:22:AA:BB:CC"
-     * - USB devices use the ALSA card and device numbers in the form  "card=X;device=Y"
-     * - Other devices may use a number or any other string.
-     */
-
-    int (*open_output_stream)(struct audio_hw_device *dev,
-                              audio_io_handle_t handle,
-                              audio_devices_t devices,
-                              audio_output_flags_t flags,
-                              struct audio_config *config,
-                              struct audio_stream_out **stream_out,
-                              const char *address);
-
-    void (*close_output_stream)(struct audio_hw_device *dev,
-                                struct audio_stream_out* stream_out);
-
-    /** This method creates and opens the audio hardware input stream */
-    int (*open_input_stream)(struct audio_hw_device *dev,
-                             audio_io_handle_t handle,
-                             audio_devices_t devices,
-                             struct audio_config *config,
-                             struct audio_stream_in **stream_in,
-                             audio_input_flags_t flags,
-                             const char *address,
-                             audio_source_t source);
-
-    void (*close_input_stream)(struct audio_hw_device *dev,
-                               struct audio_stream_in *stream_in);
-
-    /** This method dumps the state of the audio hardware */
-    int (*dump)(const struct audio_hw_device *dev, int fd);
-
-    /**
-     * set the audio mute status for all audio activities.  If any value other
-     * than 0 is returned, the software mixer will emulate this capability.
-     */
-    int (*set_master_mute)(struct audio_hw_device *dev, bool mute);
-
-    /**
-     * Get the current master mute status for the HAL, if the HAL supports
-     * master mute control.  AudioFlinger will query this value from the primary
-     * audio HAL when the service starts and use the value for setting the
-     * initial master mute across all HALs.  HALs which do not support this
-     * method may leave it set to NULL.
-     */
-    int (*get_master_mute)(struct audio_hw_device *dev, bool *mute);
-
-    /**
-     * Routing control
-     */
-
-    /* Creates an audio patch between several source and sink ports.
-     * The handle is allocated by the HAL and should be unique for this
-     * audio HAL module. */
-    int (*create_audio_patch)(struct audio_hw_device *dev,
-                               unsigned int num_sources,
-                               const struct audio_port_config *sources,
-                               unsigned int num_sinks,
-                               const struct audio_port_config *sinks,
-                               audio_patch_handle_t *handle);
-
-    /* Release an audio patch */
-    int (*release_audio_patch)(struct audio_hw_device *dev,
-                               audio_patch_handle_t handle);
-
-    /* Fills the list of supported attributes for a given audio port.
-     * As input, "port" contains the information (type, role, address etc...)
-     * needed by the HAL to identify the port.
-     * As output, "port" contains possible attributes (sampling rates, formats,
-     * channel masks, gain controllers...) for this port.
-     */
-    int (*get_audio_port)(struct audio_hw_device *dev,
-                          struct audio_port *port);
-
-    /* Set audio port configuration */
-    int (*set_audio_port_config)(struct audio_hw_device *dev,
-                         const struct audio_port_config *config);
-
-};
-typedef struct audio_hw_device audio_hw_device_t;
-
-/** convenience API for opening and closing a supported device */
-
-static inline int audio_hw_device_open(const struct hw_module_t* module,
-                                       struct audio_hw_device** device)
-{
-    return module->methods->open(module, AUDIO_HARDWARE_INTERFACE,
-                                 TO_HW_DEVICE_T_OPEN(device));
-}
-
-static inline int audio_hw_device_close(struct audio_hw_device* device)
-{
-    return device->common.close(&device->common);
-}
-
-
-__END_DECLS
-
-#endif  // ANDROID_AUDIO_INTERFACE_H
diff --git a/include/hardware/audio_alsaops.h b/include/hardware/audio_alsaops.h
deleted file mode 100644
index 6a17a35..0000000
--- a/include/hardware/audio_alsaops.h
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/* This file contains shared utility functions to handle the tinyalsa
- * implementation for Android internal audio, generally in the hardware layer.
- * Some routines may log a fatal error on failure, as noted.
- */
-
-#ifndef ANDROID_AUDIO_ALSAOPS_H
-#define ANDROID_AUDIO_ALSAOPS_H
-
-#include <log/log.h>
-
-#include <system/audio.h>
-#include <tinyalsa/asoundlib.h>
-
-__BEGIN_DECLS
-
-/* Converts audio_format to pcm_format.
- * Parameters:
- *  format  the audio_format_t to convert
- *
- * Logs a fatal error if format is not a valid convertible audio_format_t.
- */
-static inline enum pcm_format pcm_format_from_audio_format(audio_format_t format)
-{
-    switch (format) {
-#if HAVE_BIG_ENDIAN
-    case AUDIO_FORMAT_PCM_16_BIT:
-        return PCM_FORMAT_S16_BE;
-    case AUDIO_FORMAT_PCM_24_BIT_PACKED:
-        return PCM_FORMAT_S24_3BE;
-    case AUDIO_FORMAT_PCM_32_BIT:
-        return PCM_FORMAT_S32_BE;
-    case AUDIO_FORMAT_PCM_8_24_BIT:
-        return PCM_FORMAT_S24_BE;
-#else
-    case AUDIO_FORMAT_PCM_16_BIT:
-        return PCM_FORMAT_S16_LE;
-    case AUDIO_FORMAT_PCM_24_BIT_PACKED:
-        return PCM_FORMAT_S24_3LE;
-    case AUDIO_FORMAT_PCM_32_BIT:
-        return PCM_FORMAT_S32_LE;
-    case AUDIO_FORMAT_PCM_8_24_BIT:
-        return PCM_FORMAT_S24_LE;
-#endif
-    case AUDIO_FORMAT_PCM_FLOAT:  /* there is no equivalent for float */
-    default:
-        LOG_ALWAYS_FATAL("pcm_format_from_audio_format: invalid audio format %#x", format);
-        return 0;
-    }
-}
-
-/* Converts pcm_format to audio_format.
- * Parameters:
- *  format  the pcm_format to convert
- *
- * Logs a fatal error if format is not a valid convertible pcm_format.
- */
-static inline audio_format_t audio_format_from_pcm_format(enum pcm_format format)
-{
-    switch (format) {
-#if HAVE_BIG_ENDIAN
-    case PCM_FORMAT_S16_BE:
-        return AUDIO_FORMAT_PCM_16_BIT;
-    case PCM_FORMAT_S24_3BE:
-        return AUDIO_FORMAT_PCM_24_BIT_PACKED;
-    case PCM_FORMAT_S24_BE:
-        return AUDIO_FORMAT_PCM_8_24_BIT;
-    case PCM_FORMAT_S32_BE:
-        return AUDIO_FORMAT_PCM_32_BIT;
-#else
-    case PCM_FORMAT_S16_LE:
-        return AUDIO_FORMAT_PCM_16_BIT;
-    case PCM_FORMAT_S24_3LE:
-        return AUDIO_FORMAT_PCM_24_BIT_PACKED;
-    case PCM_FORMAT_S24_LE:
-        return AUDIO_FORMAT_PCM_8_24_BIT;
-    case PCM_FORMAT_S32_LE:
-        return AUDIO_FORMAT_PCM_32_BIT;
-#endif
-    default:
-        LOG_ALWAYS_FATAL("audio_format_from_pcm_format: invalid pcm format %#x", format);
-        return 0;
-    }
-}
-
-__END_DECLS
-
-#endif /* ANDROID_AUDIO_ALSAOPS_H */
diff --git a/include/hardware/audio_effect.h b/include/hardware/audio_effect.h
deleted file mode 100644
index 3366e17..0000000
--- a/include/hardware/audio_effect.h
+++ /dev/null
@@ -1,310 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-#ifndef ANDROID_AUDIO_EFFECT_H
-#define ANDROID_AUDIO_EFFECT_H
-
-#include <errno.h>
-#include <stdint.h>
-#include <strings.h>
-#include <sys/cdefs.h>
-#include <sys/types.h>
-
-#include <cutils/bitops.h>
-
-#include <system/audio_effect.h>
-
-
-__BEGIN_DECLS
-
-
-/////////////////////////////////////////////////
-//      Common Definitions
-/////////////////////////////////////////////////
-
-#define EFFECT_MAKE_API_VERSION(M, m)  (((M)<<16) | ((m) & 0xFFFF))
-#define EFFECT_API_VERSION_MAJOR(v)    ((v)>>16)
-#define EFFECT_API_VERSION_MINOR(v)    ((m) & 0xFFFF)
-
-
-/////////////////////////////////////////////////
-//      Effect control interface
-/////////////////////////////////////////////////
-
-// Effect control interface version 2.0
-#define EFFECT_CONTROL_API_VERSION EFFECT_MAKE_API_VERSION(2,0)
-
-// Effect control interface structure: effect_interface_s
-// The effect control interface is exposed by each effect engine implementation. It consists of
-// a set of functions controlling the configuration, activation and process of the engine.
-// The functions are grouped in a structure of type effect_interface_s.
-//
-// Effect control interface handle: effect_handle_t
-// The effect_handle_t serves two purposes regarding the implementation of the effect engine:
-// - 1 it is the address of a pointer to an effect_interface_s structure where the functions
-// of the effect control API for a particular effect are located.
-// - 2 it is the address of the context of a particular effect instance.
-// A typical implementation in the effect library would define a structure as follows:
-// struct effect_module_s {
-//        const struct effect_interface_s *itfe;
-//        effect_config_t config;
-//        effect_context_t context;
-// }
-// The implementation of EffectCreate() function would then allocate a structure of this
-// type and return its address as effect_handle_t
-typedef struct effect_interface_s **effect_handle_t;
-
-// Effect control interface definition
-struct effect_interface_s {
-    ////////////////////////////////////////////////////////////////////////////////
-    //
-    //    Function:       process
-    //
-    //    Description:    Effect process function. Takes input samples as specified
-    //          (count and location) in input buffer descriptor and output processed
-    //          samples as specified in output buffer descriptor. If the buffer descriptor
-    //          is not specified the function must use either the buffer or the
-    //          buffer provider function installed by the EFFECT_CMD_SET_CONFIG command.
-    //          The effect framework will call the process() function after the EFFECT_CMD_ENABLE
-    //          command is received and until the EFFECT_CMD_DISABLE is received. When the engine
-    //          receives the EFFECT_CMD_DISABLE command it should turn off the effect gracefully
-    //          and when done indicate that it is OK to stop calling the process() function by
-    //          returning the -ENODATA status.
-    //
-    //    NOTE: the process() function implementation should be "real-time safe" that is
-    //      it should not perform blocking calls: malloc/free, sleep, read/write/open/close,
-    //      pthread_cond_wait/pthread_mutex_lock...
-    //
-    //    Input:
-    //          self:       handle to the effect interface this function
-    //              is called on.
-    //          inBuffer:   buffer descriptor indicating where to read samples to process.
-    //              If NULL, use the configuration passed by EFFECT_CMD_SET_CONFIG command.
-    //
-    //          outBuffer:   buffer descriptor indicating where to write processed samples.
-    //              If NULL, use the configuration passed by EFFECT_CMD_SET_CONFIG command.
-    //
-    //    Output:
-    //        returned value:    0 successful operation
-    //                          -ENODATA the engine has finished the disable phase and the framework
-    //                                  can stop calling process()
-    //                          -EINVAL invalid interface handle or
-    //                                  invalid input/output buffer description
-    ////////////////////////////////////////////////////////////////////////////////
-    int32_t (*process)(effect_handle_t self,
-                       audio_buffer_t *inBuffer,
-                       audio_buffer_t *outBuffer);
-    ////////////////////////////////////////////////////////////////////////////////
-    //
-    //    Function:       command
-    //
-    //    Description:    Send a command and receive a response to/from effect engine.
-    //
-    //    Input:
-    //          self:       handle to the effect interface this function
-    //              is called on.
-    //          cmdCode:    command code: the command can be a standardized command defined in
-    //              effect_command_e (see below) or a proprietary command.
-    //          cmdSize:    size of command in bytes
-    //          pCmdData:   pointer to command data
-    //          pReplyData: pointer to reply data
-    //
-    //    Input/Output:
-    //          replySize: maximum size of reply data as input
-    //                      actual size of reply data as output
-    //
-    //    Output:
-    //          returned value: 0       successful operation
-    //                          -EINVAL invalid interface handle or
-    //                                  invalid command/reply size or format according to
-    //                                  command code
-    //              The return code should be restricted to indicate problems related to this API
-    //              specification. Status related to the execution of a particular command should be
-    //              indicated as part of the reply field.
-    //
-    //          *pReplyData updated with command response
-    //
-    ////////////////////////////////////////////////////////////////////////////////
-    int32_t (*command)(effect_handle_t self,
-                       uint32_t cmdCode,
-                       uint32_t cmdSize,
-                       void *pCmdData,
-                       uint32_t *replySize,
-                       void *pReplyData);
-    ////////////////////////////////////////////////////////////////////////////////
-    //
-    //    Function:        get_descriptor
-    //
-    //    Description:    Returns the effect descriptor
-    //
-    //    Input:
-    //          self:       handle to the effect interface this function
-    //              is called on.
-    //
-    //    Input/Output:
-    //          pDescriptor:    address where to return the effect descriptor.
-    //
-    //    Output:
-    //        returned value:    0          successful operation.
-    //                          -EINVAL     invalid interface handle or invalid pDescriptor
-    //        *pDescriptor:     updated with the effect descriptor.
-    //
-    ////////////////////////////////////////////////////////////////////////////////
-    int32_t (*get_descriptor)(effect_handle_t self,
-                              effect_descriptor_t *pDescriptor);
-    ////////////////////////////////////////////////////////////////////////////////
-    //
-    //    Function:       process_reverse
-    //
-    //    Description:    Process reverse stream function. This function is used to pass
-    //          a reference stream to the effect engine. If the engine does not need a reference
-    //          stream, this function pointer can be set to NULL.
-    //          This function would typically implemented by an Echo Canceler.
-    //
-    //    Input:
-    //          self:       handle to the effect interface this function
-    //              is called on.
-    //          inBuffer:   buffer descriptor indicating where to read samples to process.
-    //              If NULL, use the configuration passed by EFFECT_CMD_SET_CONFIG_REVERSE command.
-    //
-    //          outBuffer:   buffer descriptor indicating where to write processed samples.
-    //              If NULL, use the configuration passed by EFFECT_CMD_SET_CONFIG_REVERSE command.
-    //              If the buffer and buffer provider in the configuration received by
-    //              EFFECT_CMD_SET_CONFIG_REVERSE are also NULL, do not return modified reverse
-    //              stream data
-    //
-    //    Output:
-    //        returned value:    0 successful operation
-    //                          -ENODATA the engine has finished the disable phase and the framework
-    //                                  can stop calling process_reverse()
-    //                          -EINVAL invalid interface handle or
-    //                                  invalid input/output buffer description
-    ////////////////////////////////////////////////////////////////////////////////
-    int32_t (*process_reverse)(effect_handle_t self,
-                               audio_buffer_t *inBuffer,
-                               audio_buffer_t *outBuffer);
-};
-
-/////////////////////////////////////////////////
-//      Effect library interface
-/////////////////////////////////////////////////
-
-// Effect library interface version 3.0
-// Note that EffectsFactory.c only checks the major version component, so changes to the minor
-// number can only be used for fully backwards compatible changes
-#define EFFECT_LIBRARY_API_VERSION EFFECT_MAKE_API_VERSION(3,0)
-
-#define AUDIO_EFFECT_LIBRARY_TAG ((('A') << 24) | (('E') << 16) | (('L') << 8) | ('T'))
-
-// Every effect library must have a data structure named AUDIO_EFFECT_LIBRARY_INFO_SYM
-// and the fields of this data structure must begin with audio_effect_library_t
-
-typedef struct audio_effect_library_s {
-    // tag must be initialized to AUDIO_EFFECT_LIBRARY_TAG
-    uint32_t tag;
-    // Version of the effect library API : 0xMMMMmmmm MMMM: Major, mmmm: minor
-    uint32_t version;
-    // Name of this library
-    const char *name;
-    // Author/owner/implementor of the library
-    const char *implementor;
-
-    ////////////////////////////////////////////////////////////////////////////////
-    //
-    //    Function:        create_effect
-    //
-    //    Description:    Creates an effect engine of the specified implementation uuid and
-    //          returns an effect control interface on this engine. The function will allocate the
-    //          resources for an instance of the requested effect engine and return
-    //          a handle on the effect control interface.
-    //
-    //    Input:
-    //          uuid:    pointer to the effect uuid.
-    //          sessionId:  audio session to which this effect instance will be attached.
-    //              All effects created with the same session ID are connected in series and process
-    //              the same signal stream. Knowing that two effects are part of the same effect
-    //              chain can help the library implement some kind of optimizations.
-    //          ioId:   identifies the output or input stream this effect is directed to in
-    //              audio HAL.
-    //              For future use especially with tunneled HW accelerated effects
-    //
-    //    Input/Output:
-    //          pHandle:        address where to return the effect interface handle.
-    //
-    //    Output:
-    //        returned value:    0          successful operation.
-    //                          -ENODEV     library failed to initialize
-    //                          -EINVAL     invalid pEffectUuid or pHandle
-    //                          -ENOENT     no effect with this uuid found
-    //        *pHandle:         updated with the effect interface handle.
-    //
-    ////////////////////////////////////////////////////////////////////////////////
-    int32_t (*create_effect)(const effect_uuid_t *uuid,
-                             int32_t sessionId,
-                             int32_t ioId,
-                             effect_handle_t *pHandle);
-
-    ////////////////////////////////////////////////////////////////////////////////
-    //
-    //    Function:        release_effect
-    //
-    //    Description:    Releases the effect engine whose handle is given as argument.
-    //          All resources allocated to this particular instance of the effect are
-    //          released.
-    //
-    //    Input:
-    //          handle:         handle on the effect interface to be released.
-    //
-    //    Output:
-    //        returned value:    0          successful operation.
-    //                          -ENODEV     library failed to initialize
-    //                          -EINVAL     invalid interface handle
-    //
-    ////////////////////////////////////////////////////////////////////////////////
-    int32_t (*release_effect)(effect_handle_t handle);
-
-    ////////////////////////////////////////////////////////////////////////////////
-    //
-    //    Function:        get_descriptor
-    //
-    //    Description:    Returns the descriptor of the effect engine which implementation UUID is
-    //          given as argument.
-    //
-    //    Input/Output:
-    //          uuid:           pointer to the effect uuid.
-    //          pDescriptor:    address where to return the effect descriptor.
-    //
-    //    Output:
-    //        returned value:    0          successful operation.
-    //                          -ENODEV     library failed to initialize
-    //                          -EINVAL     invalid pDescriptor or uuid
-    //        *pDescriptor:     updated with the effect descriptor.
-    //
-    ////////////////////////////////////////////////////////////////////////////////
-    int32_t (*get_descriptor)(const effect_uuid_t *uuid,
-                              effect_descriptor_t *pDescriptor);
-} audio_effect_library_t;
-
-// Name of the hal_module_info
-#define AUDIO_EFFECT_LIBRARY_INFO_SYM         AELI
-
-// Name of the hal_module_info as a string
-#define AUDIO_EFFECT_LIBRARY_INFO_SYM_AS_STR  "AELI"
-
-__END_DECLS
-
-#endif  // ANDROID_AUDIO_EFFECT_H
diff --git a/include/hardware/audio_policy.h b/include/hardware/audio_policy.h
deleted file mode 100644
index bacb1e5..0000000
--- a/include/hardware/audio_policy.h
+++ /dev/null
@@ -1,457 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-#ifndef ANDROID_AUDIO_POLICY_INTERFACE_H
-#define ANDROID_AUDIO_POLICY_INTERFACE_H
-
-#include <stdint.h>
-#include <sys/cdefs.h>
-#include <sys/types.h>
-
-#include <hardware/hardware.h>
-
-#include <system/audio.h>
-#include <system/audio_policy.h>
-
-__BEGIN_DECLS
-
-/**
- * The id of this module
- */
-#define AUDIO_POLICY_HARDWARE_MODULE_ID "audio_policy"
-
-/**
- * Name of the audio devices to open
- */
-#define AUDIO_POLICY_INTERFACE "policy"
-
-/* ---------------------------------------------------------------------------- */
-
-/*
- * The audio_policy and audio_policy_service_ops structs define the
- * communication interfaces between the platform specific audio policy manager
- * and Android generic audio policy manager.
- * The platform specific audio policy manager must implement methods of the
- * audio_policy struct.
- * This implementation makes use of the audio_policy_service_ops to control
- * the activity and configuration of audio input and output streams.
- *
- * The platform specific audio policy manager is in charge of the audio
- * routing and volume control policies for a given platform.
- * The main roles of this module are:
- *   - keep track of current system state (removable device connections, phone
- *     state, user requests...).
- *   System state changes and user actions are notified to audio policy
- *   manager with methods of the audio_policy.
- *
- *   - process get_output() queries received when AudioTrack objects are
- *     created: Those queries return a handler on an output that has been
- *     selected, configured and opened by the audio policy manager and that
- *     must be used by the AudioTrack when registering to the AudioFlinger
- *     with the createTrack() method.
- *   When the AudioTrack object is released, a release_output() query
- *   is received and the audio policy manager can decide to close or
- *   reconfigure the output depending on other streams using this output and
- *   current system state.
- *
- *   - similarly process get_input() and release_input() queries received from
- *     AudioRecord objects and configure audio inputs.
- *   - process volume control requests: the stream volume is converted from
- *     an index value (received from UI) to a float value applicable to each
- *     output as a function of platform specific settings and current output
- *     route (destination device). It also make sure that streams are not
- *     muted if not allowed (e.g. camera shutter sound in some countries).
- */
-
-/* XXX: this should be defined OUTSIDE of frameworks/base */
-struct effect_descriptor_s;
-
-struct audio_policy {
-    /*
-     * configuration functions
-     */
-
-    /* indicate a change in device connection status */
-    int (*set_device_connection_state)(struct audio_policy *pol,
-                                       audio_devices_t device,
-                                       audio_policy_dev_state_t state,
-                                       const char *device_address);
-
-    /* retrieve a device connection status */
-    audio_policy_dev_state_t (*get_device_connection_state)(
-                                            const struct audio_policy *pol,
-                                            audio_devices_t device,
-                                            const char *device_address);
-
-    /* indicate a change in phone state. Valid phones states are defined
-     * by audio_mode_t */
-    void (*set_phone_state)(struct audio_policy *pol, audio_mode_t state);
-
-    /* deprecated, never called (was "indicate a change in ringer mode") */
-    void (*set_ringer_mode)(struct audio_policy *pol, uint32_t mode,
-                            uint32_t mask);
-
-    /* force using a specific device category for the specified usage */
-    void (*set_force_use)(struct audio_policy *pol,
-                          audio_policy_force_use_t usage,
-                          audio_policy_forced_cfg_t config);
-
-    /* retrieve current device category forced for a given usage */
-    audio_policy_forced_cfg_t (*get_force_use)(const struct audio_policy *pol,
-                                               audio_policy_force_use_t usage);
-
-    /* if can_mute is true, then audio streams that are marked ENFORCED_AUDIBLE
-     * can still be muted. */
-    void (*set_can_mute_enforced_audible)(struct audio_policy *pol,
-                                          bool can_mute);
-
-    /* check proper initialization */
-    int (*init_check)(const struct audio_policy *pol);
-
-    /*
-     * Audio routing query functions
-     */
-
-    /* request an output appropriate for playback of the supplied stream type and
-     * parameters */
-    audio_io_handle_t (*get_output)(struct audio_policy *pol,
-                                    audio_stream_type_t stream,
-                                    uint32_t samplingRate,
-                                    audio_format_t format,
-                                    audio_channel_mask_t channelMask,
-                                    audio_output_flags_t flags,
-                                    const audio_offload_info_t *offloadInfo);
-
-    /* indicates to the audio policy manager that the output starts being used
-     * by corresponding stream. */
-    int (*start_output)(struct audio_policy *pol,
-                        audio_io_handle_t output,
-                        audio_stream_type_t stream,
-                        audio_session_t session);
-
-    /* indicates to the audio policy manager that the output stops being used
-     * by corresponding stream. */
-    int (*stop_output)(struct audio_policy *pol,
-                       audio_io_handle_t output,
-                       audio_stream_type_t stream,
-                       audio_session_t session);
-
-    /* releases the output. */
-    void (*release_output)(struct audio_policy *pol, audio_io_handle_t output);
-
-    /* request an input appropriate for record from the supplied device with
-     * supplied parameters. */
-    audio_io_handle_t (*get_input)(struct audio_policy *pol, audio_source_t inputSource,
-                                   uint32_t samplingRate,
-                                   audio_format_t format,
-                                   audio_channel_mask_t channelMask,
-                                   audio_in_acoustics_t acoustics);
-
-    /* indicates to the audio policy manager that the input starts being used */
-    int (*start_input)(struct audio_policy *pol, audio_io_handle_t input);
-
-    /* indicates to the audio policy manager that the input stops being used. */
-    int (*stop_input)(struct audio_policy *pol, audio_io_handle_t input);
-
-    /* releases the input. */
-    void (*release_input)(struct audio_policy *pol, audio_io_handle_t input);
-
-    /*
-     * volume control functions
-     */
-
-    /* initialises stream volume conversion parameters by specifying volume
-     * index range. The index range for each stream is defined by AudioService. */
-    void (*init_stream_volume)(struct audio_policy *pol,
-                               audio_stream_type_t stream,
-                               int index_min,
-                               int index_max);
-
-    /* sets the new stream volume at a level corresponding to the supplied
-     * index. The index is within the range specified by init_stream_volume() */
-    int (*set_stream_volume_index)(struct audio_policy *pol,
-                                   audio_stream_type_t stream,
-                                   int index);
-
-    /* retrieve current volume index for the specified stream */
-    int (*get_stream_volume_index)(const struct audio_policy *pol,
-                                   audio_stream_type_t stream,
-                                   int *index);
-
-    /* sets the new stream volume at a level corresponding to the supplied
-     * index for the specified device.
-     * The index is within the range specified by init_stream_volume() */
-    int (*set_stream_volume_index_for_device)(struct audio_policy *pol,
-                                   audio_stream_type_t stream,
-                                   int index,
-                                   audio_devices_t device);
-
-    /* retrieve current volume index for the specified stream for the specified device */
-    int (*get_stream_volume_index_for_device)(const struct audio_policy *pol,
-                                   audio_stream_type_t stream,
-                                   int *index,
-                                   audio_devices_t device);
-
-    /* return the strategy corresponding to a given stream type */
-    uint32_t (*get_strategy_for_stream)(const struct audio_policy *pol,
-                                        audio_stream_type_t stream);
-
-    /* return the enabled output devices for the given stream type */
-    audio_devices_t (*get_devices_for_stream)(const struct audio_policy *pol,
-                                       audio_stream_type_t stream);
-
-    /* Audio effect management */
-    audio_io_handle_t (*get_output_for_effect)(struct audio_policy *pol,
-                                            const struct effect_descriptor_s *desc);
-
-    int (*register_effect)(struct audio_policy *pol,
-                           const struct effect_descriptor_s *desc,
-                           audio_io_handle_t output,
-                           uint32_t strategy,
-                           audio_session_t session,
-                           int id);
-
-    int (*unregister_effect)(struct audio_policy *pol, int id);
-
-    int (*set_effect_enabled)(struct audio_policy *pol, int id, bool enabled);
-
-    bool (*is_stream_active)(const struct audio_policy *pol,
-            audio_stream_type_t stream,
-            uint32_t in_past_ms);
-
-    bool (*is_stream_active_remotely)(const struct audio_policy *pol,
-            audio_stream_type_t stream,
-            uint32_t in_past_ms);
-
-    bool (*is_source_active)(const struct audio_policy *pol,
-            audio_source_t source);
-
-    /* dump state */
-    int (*dump)(const struct audio_policy *pol, int fd);
-
-    /* check if offload is possible for given sample rate, bitrate, duration, ... */
-    bool (*is_offload_supported)(const struct audio_policy *pol,
-                                const audio_offload_info_t *info);
-};
-
-
-struct audio_policy_service_ops {
-    /*
-     * Audio output Control functions
-     */
-
-    /* Opens an audio output with the requested parameters.
-     *
-     * The parameter values can indicate to use the default values in case the
-     * audio policy manager has no specific requirements for the output being
-     * opened.
-     *
-     * When the function returns, the parameter values reflect the actual
-     * values used by the audio hardware output stream.
-     *
-     * The audio policy manager can check if the proposed parameters are
-     * suitable or not and act accordingly.
-     */
-    audio_io_handle_t (*open_output)(void *service,
-                                     audio_devices_t *pDevices,
-                                     uint32_t *pSamplingRate,
-                                     audio_format_t *pFormat,
-                                     audio_channel_mask_t *pChannelMask,
-                                     uint32_t *pLatencyMs,
-                                     audio_output_flags_t flags);
-
-    /* creates a special output that is duplicated to the two outputs passed as
-     * arguments. The duplication is performed by
-     * a special mixer thread in the AudioFlinger.
-     */
-    audio_io_handle_t (*open_duplicate_output)(void *service,
-                                               audio_io_handle_t output1,
-                                               audio_io_handle_t output2);
-
-    /* closes the output stream */
-    int (*close_output)(void *service, audio_io_handle_t output);
-
-    /* suspends the output.
-     *
-     * When an output is suspended, the corresponding audio hardware output
-     * stream is placed in standby and the AudioTracks attached to the mixer
-     * thread are still processed but the output mix is discarded.
-     */
-    int (*suspend_output)(void *service, audio_io_handle_t output);
-
-    /* restores a suspended output. */
-    int (*restore_output)(void *service, audio_io_handle_t output);
-
-    /* */
-    /* Audio input Control functions */
-    /* */
-
-    /* opens an audio input
-     * deprecated - new implementations should use open_input_on_module,
-     * and the acoustics parameter is ignored
-     */
-    audio_io_handle_t (*open_input)(void *service,
-                                    audio_devices_t *pDevices,
-                                    uint32_t *pSamplingRate,
-                                    audio_format_t *pFormat,
-                                    audio_channel_mask_t *pChannelMask,
-                                    audio_in_acoustics_t acoustics);
-
-    /* closes an audio input */
-    int (*close_input)(void *service, audio_io_handle_t input);
-
-    /* */
-    /* misc control functions */
-    /* */
-
-    /* set a stream volume for a particular output.
-     *
-     * For the same user setting, a given stream type can have different
-     * volumes for each output (destination device) it is attached to.
-     */
-    int (*set_stream_volume)(void *service,
-                             audio_stream_type_t stream,
-                             float volume,
-                             audio_io_handle_t output,
-                             int delay_ms);
-
-    /* invalidate a stream type, causing a reroute to an unspecified new output */
-    int (*invalidate_stream)(void *service,
-                             audio_stream_type_t stream);
-
-    /* function enabling to send proprietary informations directly from audio
-     * policy manager to audio hardware interface. */
-    void (*set_parameters)(void *service,
-                           audio_io_handle_t io_handle,
-                           const char *kv_pairs,
-                           int delay_ms);
-
-    /* function enabling to receive proprietary informations directly from
-     * audio hardware interface to audio policy manager.
-     *
-     * Returns a pointer to a heap allocated string. The caller is responsible
-     * for freeing the memory for it using free().
-     */
-
-    char * (*get_parameters)(void *service, audio_io_handle_t io_handle,
-                             const char *keys);
-
-    /* request the playback of a tone on the specified stream.
-     * used for instance to replace notification sounds when playing over a
-     * telephony device during a phone call.
-     */
-    int (*start_tone)(void *service,
-                      audio_policy_tone_t tone,
-                      audio_stream_type_t stream);
-
-    int (*stop_tone)(void *service);
-
-    /* set down link audio volume. */
-    int (*set_voice_volume)(void *service,
-                            float volume,
-                            int delay_ms);
-
-    /* move effect to the specified output */
-    int (*move_effects)(void *service,
-                        audio_session_t session,
-                        audio_io_handle_t src_output,
-                        audio_io_handle_t dst_output);
-
-    /* loads an audio hw module.
-     *
-     * The module name passed is the base name of the HW module library, e.g "primary" or "a2dp".
-     * The function returns a handle on the module that will be used to specify a particular
-     * module when calling open_output_on_module() or open_input_on_module()
-     */
-    audio_module_handle_t (*load_hw_module)(void *service,
-                                              const char *name);
-
-    /* Opens an audio output on a particular HW module.
-     *
-     * Same as open_output() but specifying a specific HW module on which the output must be opened.
-     */
-    audio_io_handle_t (*open_output_on_module)(void *service,
-                                     audio_module_handle_t module,
-                                     audio_devices_t *pDevices,
-                                     uint32_t *pSamplingRate,
-                                     audio_format_t *pFormat,
-                                     audio_channel_mask_t *pChannelMask,
-                                     uint32_t *pLatencyMs,
-                                     audio_output_flags_t flags,
-                                     const audio_offload_info_t *offloadInfo);
-
-    /* Opens an audio input on a particular HW module.
-     *
-     * Same as open_input() but specifying a specific HW module on which the input must be opened.
-     * Also removed deprecated acoustics parameter
-     */
-    audio_io_handle_t (*open_input_on_module)(void *service,
-                                    audio_module_handle_t module,
-                                    audio_devices_t *pDevices,
-                                    uint32_t *pSamplingRate,
-                                    audio_format_t *pFormat,
-                                    audio_channel_mask_t *pChannelMask);
-
-};
-
-/**********************************************************************/
-
-/**
- * Every hardware module must have a data structure named HAL_MODULE_INFO_SYM
- * and the fields of this data structure must begin with hw_module_t
- * followed by module specific information.
- */
-typedef struct audio_policy_module {
-    struct hw_module_t common;
-} audio_policy_module_t;
-
-struct audio_policy_device {
-    /**
-     * Common methods of the audio policy device.  This *must* be the first member of
-     * audio_policy_device as users of this structure will cast a hw_device_t to
-     * audio_policy_device pointer in contexts where it's known the hw_device_t references an
-     * audio_policy_device.
-     */
-    struct hw_device_t common;
-
-    int (*create_audio_policy)(const struct audio_policy_device *device,
-                               struct audio_policy_service_ops *aps_ops,
-                               void *service,
-                               struct audio_policy **ap);
-
-    int (*destroy_audio_policy)(const struct audio_policy_device *device,
-                                struct audio_policy *ap);
-};
-
-/** convenience API for opening and closing a supported device */
-
-static inline int audio_policy_dev_open(const hw_module_t* module,
-                                    struct audio_policy_device** device)
-{
-    return module->methods->open(module, AUDIO_POLICY_INTERFACE,
-                                 (hw_device_t**)device);
-}
-
-static inline int audio_policy_dev_close(struct audio_policy_device* device)
-{
-    return device->common.close(&device->common);
-}
-
-
-__END_DECLS
-
-#endif  // ANDROID_AUDIO_POLICY_INTERFACE_H
diff --git a/modules/audio/Android.bp b/modules/audio/Android.bp
index a7467c2..7929c66 100644
--- a/modules/audio/Android.bp
+++ b/modules/audio/Android.bp
@@ -23,7 +23,10 @@
     relative_install_path: "hw",
     proprietary: true,
     srcs: ["audio_hw.c"],
-    header_libs: ["libhardware_headers"],
+    header_libs: [
+        "libhardware_headers",
+        "android.hardware.audio.common.legacy@2.0",
+    ],
     shared_libs: [
         "liblog",
     ],
@@ -41,21 +44,10 @@
     relative_install_path: "hw",
     proprietary: true,
     srcs: ["audio_hw.c"],
-    header_libs: ["libhardware_headers"],
-    shared_libs: [
-        "liblog",
+    header_libs: [
+        "libhardware_headers",
+        "android.hardware.audio.common.legacy@2.0",
     ],
-    cflags: ["-Wall", "-Werror", "-Wno-unused-parameter"],
-}
-
-// The stub audio policy HAL module that can be used as a skeleton for
-// new implementations.
-cc_library_shared {
-    name: "audio_policy.stub",
-    relative_install_path: "hw",
-    proprietary: true,
-    srcs: ["audio_policy.c"],
-    header_libs: ["libhardware_headers"],
     shared_libs: [
         "liblog",
     ],
diff --git a/modules/audio/audio_policy.c b/modules/audio/audio_policy.c
deleted file mode 100644
index 4f9cd5a..0000000
--- a/modules/audio/audio_policy.c
+++ /dev/null
@@ -1,350 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#define LOG_TAG "audio_policy_default"
-//#define LOG_NDEBUG 0
-
-#include <errno.h>
-#include <stdint.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <hardware/hardware.h>
-#include <system/audio.h>
-#include <system/audio_policy.h>
-#include <hardware/audio_policy.h>
-
-struct default_ap_module {
-    struct audio_policy_module module;
-};
-
-struct default_ap_device {
-    struct audio_policy_device device;
-};
-
-struct default_audio_policy {
-    struct audio_policy policy;
-
-    struct audio_policy_service_ops *aps_ops;
-    void *service;
-};
-
-static int ap_set_device_connection_state(struct audio_policy *pol,
-                                          audio_devices_t device,
-                                          audio_policy_dev_state_t state,
-                                          const char *device_address)
-{
-    return -ENOSYS;
-}
-
-static audio_policy_dev_state_t ap_get_device_connection_state(
-                                            const struct audio_policy *pol,
-                                            audio_devices_t device,
-                                            const char *device_address)
-{
-    return AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE;
-}
-
-static void ap_set_phone_state(struct audio_policy *pol, audio_mode_t state)
-{
-}
-
-// deprecated, never called
-static void ap_set_ringer_mode(struct audio_policy *pol, uint32_t mode,
-                               uint32_t mask)
-{
-}
-
-static void ap_set_force_use(struct audio_policy *pol,
-                          audio_policy_force_use_t usage,
-                          audio_policy_forced_cfg_t config)
-{
-}
-
-    /* retreive current device category forced for a given usage */
-static audio_policy_forced_cfg_t ap_get_force_use(
-                                               const struct audio_policy *pol,
-                                               audio_policy_force_use_t usage)
-{
-    return AUDIO_POLICY_FORCE_NONE;
-}
-
-/* if can_mute is true, then audio streams that are marked ENFORCED_AUDIBLE
- * can still be muted. */
-static void ap_set_can_mute_enforced_audible(struct audio_policy *pol,
-                                             bool can_mute)
-{
-}
-
-static int ap_init_check(const struct audio_policy *pol)
-{
-    return 0;
-}
-
-static audio_io_handle_t ap_get_output(struct audio_policy *pol,
-                                       audio_stream_type_t stream,
-                                       uint32_t sampling_rate,
-                                       audio_format_t format,
-                                       audio_channel_mask_t channelMask,
-                                       audio_output_flags_t flags,
-                                       const audio_offload_info_t *info)
-{
-    return 0;
-}
-
-static int ap_start_output(struct audio_policy *pol, audio_io_handle_t output,
-                           audio_stream_type_t stream, int session)
-{
-    return -ENOSYS;
-}
-
-static int ap_stop_output(struct audio_policy *pol, audio_io_handle_t output,
-                          audio_stream_type_t stream, int session)
-{
-    return -ENOSYS;
-}
-
-static void ap_release_output(struct audio_policy *pol,
-                              audio_io_handle_t output)
-{
-}
-
-static audio_io_handle_t ap_get_input(struct audio_policy *pol, audio_source_t inputSource,
-                                      uint32_t sampling_rate,
-                                      audio_format_t format,
-                                      audio_channel_mask_t channelMask,
-                                      audio_in_acoustics_t acoustics)
-{
-    return 0;
-}
-
-static int ap_start_input(struct audio_policy *pol, audio_io_handle_t input)
-{
-    return -ENOSYS;
-}
-
-static int ap_stop_input(struct audio_policy *pol, audio_io_handle_t input)
-{
-    return -ENOSYS;
-}
-
-static void ap_release_input(struct audio_policy *pol, audio_io_handle_t input)
-{
-}
-
-static void ap_init_stream_volume(struct audio_policy *pol,
-                                  audio_stream_type_t stream, int index_min,
-                                  int index_max)
-{
-}
-
-static int ap_set_stream_volume_index(struct audio_policy *pol,
-                                      audio_stream_type_t stream,
-                                      int index)
-{
-    return -ENOSYS;
-}
-
-static int ap_get_stream_volume_index(const struct audio_policy *pol,
-                                      audio_stream_type_t stream,
-                                      int *index)
-{
-    return -ENOSYS;
-}
-
-static int ap_set_stream_volume_index_for_device(struct audio_policy *pol,
-                                      audio_stream_type_t stream,
-                                      int index,
-                                      audio_devices_t device)
-{
-    return -ENOSYS;
-}
-
-static int ap_get_stream_volume_index_for_device(const struct audio_policy *pol,
-                                      audio_stream_type_t stream,
-                                      int *index,
-                                      audio_devices_t device)
-{
-    return -ENOSYS;
-}
-
-static uint32_t ap_get_strategy_for_stream(const struct audio_policy *pol,
-                                           audio_stream_type_t stream)
-{
-    return 0;
-}
-
-static audio_devices_t ap_get_devices_for_stream(const struct audio_policy *pol,
-                                          audio_stream_type_t stream)
-{
-    return 0;
-}
-
-static audio_io_handle_t ap_get_output_for_effect(struct audio_policy *pol,
-                                            const struct effect_descriptor_s *desc)
-{
-    return 0;
-}
-
-static int ap_register_effect(struct audio_policy *pol,
-                              const struct effect_descriptor_s *desc,
-                              audio_io_handle_t output,
-                              uint32_t strategy,
-                              int session,
-                              int id)
-{
-    return -ENOSYS;
-}
-
-static int ap_unregister_effect(struct audio_policy *pol, int id)
-{
-    return -ENOSYS;
-}
-
-static int ap_set_effect_enabled(struct audio_policy *pol, int id, bool enabled)
-{
-    return -ENOSYS;
-}
-
-static bool ap_is_stream_active(const struct audio_policy *pol, audio_stream_type_t stream,
-                                uint32_t in_past_ms)
-{
-    return false;
-}
-
-static int ap_dump(const struct audio_policy *pol, int fd)
-{
-    return -ENOSYS;
-}
-
-static bool ap_is_offload_supported(const struct audio_policy *pol,
-                                   const audio_offload_info_t *info)
-{
-    return false;
-}
-
-static int create_default_ap(const struct audio_policy_device *device,
-                             struct audio_policy_service_ops *aps_ops,
-                             void *service,
-                             struct audio_policy **ap)
-{
-    struct default_audio_policy *dap;
-
-    *ap = NULL;
-
-    if (!service || !aps_ops)
-        return -EINVAL;
-
-    dap = (struct default_audio_policy *)calloc(1, sizeof(*dap));
-    if (!dap)
-        return -ENOMEM;
-
-    dap->policy.set_device_connection_state = ap_set_device_connection_state;
-    dap->policy.get_device_connection_state = ap_get_device_connection_state;
-    dap->policy.set_phone_state = ap_set_phone_state;
-    dap->policy.set_ringer_mode = ap_set_ringer_mode;
-    dap->policy.set_force_use = ap_set_force_use;
-    dap->policy.get_force_use = ap_get_force_use;
-    dap->policy.set_can_mute_enforced_audible =
-        ap_set_can_mute_enforced_audible;
-    dap->policy.init_check = ap_init_check;
-    dap->policy.get_output = ap_get_output;
-    dap->policy.start_output = ap_start_output;
-    dap->policy.stop_output = ap_stop_output;
-    dap->policy.release_output = ap_release_output;
-    dap->policy.get_input = ap_get_input;
-    dap->policy.start_input = ap_start_input;
-    dap->policy.stop_input = ap_stop_input;
-    dap->policy.release_input = ap_release_input;
-    dap->policy.init_stream_volume = ap_init_stream_volume;
-    dap->policy.set_stream_volume_index = ap_set_stream_volume_index;
-    dap->policy.get_stream_volume_index = ap_get_stream_volume_index;
-    dap->policy.set_stream_volume_index_for_device = ap_set_stream_volume_index_for_device;
-    dap->policy.get_stream_volume_index_for_device = ap_get_stream_volume_index_for_device;
-    dap->policy.get_strategy_for_stream = ap_get_strategy_for_stream;
-    dap->policy.get_devices_for_stream = ap_get_devices_for_stream;
-    dap->policy.get_output_for_effect = ap_get_output_for_effect;
-    dap->policy.register_effect = ap_register_effect;
-    dap->policy.unregister_effect = ap_unregister_effect;
-    dap->policy.set_effect_enabled = ap_set_effect_enabled;
-    dap->policy.is_stream_active = ap_is_stream_active;
-    dap->policy.dump = ap_dump;
-
-    dap->policy.is_offload_supported = ap_is_offload_supported;
-
-    dap->service = service;
-    dap->aps_ops = aps_ops;
-
-    *ap = &dap->policy;
-    return 0;
-}
-
-static int destroy_default_ap(const struct audio_policy_device *ap_dev,
-                              struct audio_policy *ap)
-{
-    free(ap);
-    return 0;
-}
-
-static int default_ap_dev_close(hw_device_t* device)
-{
-    free(device);
-    return 0;
-}
-
-static int default_ap_dev_open(const hw_module_t* module, const char* name,
-                               hw_device_t** device)
-{
-    struct default_ap_device *dev;
-
-    *device = NULL;
-
-    if (strcmp(name, AUDIO_POLICY_INTERFACE) != 0)
-        return -EINVAL;
-
-    dev = (struct default_ap_device *)calloc(1, sizeof(*dev));
-    if (!dev)
-        return -ENOMEM;
-
-    dev->device.common.tag = HARDWARE_DEVICE_TAG;
-    dev->device.common.version = 0;
-    dev->device.common.module = (hw_module_t *)module;
-    dev->device.common.close = default_ap_dev_close;
-    dev->device.create_audio_policy = create_default_ap;
-    dev->device.destroy_audio_policy = destroy_default_ap;
-
-    *device = &dev->device.common;
-
-    return 0;
-}
-
-static struct hw_module_methods_t default_ap_module_methods = {
-    .open = default_ap_dev_open,
-};
-
-struct default_ap_module HAL_MODULE_INFO_SYM = {
-    .module = {
-        .common = {
-            .tag            = HARDWARE_MODULE_TAG,
-            .version_major  = 1,
-            .version_minor  = 0,
-            .id             = AUDIO_POLICY_HARDWARE_MODULE_ID,
-            .name           = "Default audio policy HAL",
-            .author         = "The Android Open Source Project",
-            .methods        = &default_ap_module_methods,
-        },
-    },
-};
diff --git a/modules/audio_remote_submix/Android.bp b/modules/audio_remote_submix/Android.bp
index c7d018c..578949e 100644
--- a/modules/audio_remote_submix/Android.bp
+++ b/modules/audio_remote_submix/Android.bp
@@ -17,16 +17,15 @@
     relative_install_path: "hw",
     vendor: true,
     srcs: ["audio_hw.cpp"],
-    include_dirs: [
-        "system/media/audio_utils/include",
-    ],
+
     shared_libs: [
         "liblog",
         "libcutils",
         "libutils",
-        "libnbaio_mono",
+        "libnbaio_mono@2.0",
+        "libaudioutils",
     ],
-    static_libs: ["libmedia_helper"],
+    static_libs: ["libmedia_helper@2.0"],
 
     cflags: ["-Wno-unused-parameter"],
 
diff --git a/modules/usbaudio/Android.bp b/modules/usbaudio/Android.bp
index c7d403f..ecc74fb 100644
--- a/modules/usbaudio/Android.bp
+++ b/modules/usbaudio/Android.bp
@@ -25,5 +25,7 @@
         "libalsautils",
     ],
     cflags: ["-Wno-unused-parameter"],
-    header_libs: ["libhardware_headers"],
+    header_libs: [
+        "android.hardware.audio.common.legacy@2.0",
+    ],
 }
