diff --git a/include/hardware/AudioHardwareInterface.h b/include/hardware/AudioHardwareInterface.h
index febc86a..66cf0ff 100644
--- a/include/hardware/AudioHardwareInterface.h
+++ b/include/hardware/AudioHardwareInterface.h
@@ -33,137 +33,159 @@
 // ----------------------------------------------------------------------------
 
 /**
- * This is the abstraction interface for the audio output hardware. It provides 
- * information about various properties of the audio output hardware driver.
+ * AudioStreamOut is the abstraction interface for the audio output hardware.
+ *
+ * It provides information about various properties of the audio output hardware driver.
  */
 class AudioStreamOut {
 public:
     virtual             ~AudioStreamOut() = 0;
-    
+
     /** return audio sampling rate in hz - eg. 44100 */
     virtual uint32_t    sampleRate() const = 0;
-    
+
     /** returns size of output buffer - eg. 4800 */
     virtual size_t      bufferSize() const = 0;
-    
-    /** 
-     * return number of output audio channels. 
-     * Acceptable values are 1 (mono) or 2 (stereo) 
+
+    /**
+     * return number of output audio channels.
+     * Acceptable values are 1 (mono) or 2 (stereo)
      */
     virtual int         channelCount() const = 0;
-    
+
     /**
-     * return audio format in 8bit or 16bit PCM format - 
-     * eg. AudioSystem:PCM_16_BIT 
+     * return audio format in 8bit or 16bit PCM format -
+     * eg. AudioSystem:PCM_16_BIT
      */
     virtual int         format() const = 0;
-    
-    /** 
-     * This method can be used in situations where audio mixing is done in the
-     * hardware. It is a direct interface to the hardware to set the volume as
-     * as opposed to controlling this via the framework. It could be multiple 
-     * PCM outputs or hardware accelerated codecs such as MP3 or AAC
+
+    /**
+     * return the frame size (number of bytes per sample).
+     */
+    uint32_t    frameSize() const { return channelCount()*((format()==AudioSystem::PCM_16_BIT)?sizeof(int16_t):sizeof(int8_t)); }
+
+    /**
+     * return the audio hardware driver latency in milli seconds.
+     */
+    virtual uint32_t    latency() const = 0;
+
+    /**
+     * 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.
      */
     virtual status_t    setVolume(float volume) = 0;
-    
+
     /** write audio buffer to driver. Returns number of bytes written */
     virtual ssize_t     write(const void* buffer, size_t bytes) = 0;
 
     /** dump the state of the audio output device */
-    virtual status_t dump(int fd, const Vector<String16>& args) = 0; 
+    virtual status_t dump(int fd, const Vector<String16>& args) = 0;
 };
 
 /**
- * This is the abstraction interface for the audio input hardware. It defines 
- * the various properties of the audio hardware input driver.  
+ * AudioStreamIn is the abstraction interface for the audio input hardware.
+ *
+ * It defines the various properties of the audio hardware input driver.
  */
 class AudioStreamIn {
 public:
     virtual             ~AudioStreamIn() = 0;
-    
+
     /** return the input buffer size allowed by audio driver */
     virtual size_t      bufferSize() const = 0;
 
     /** return the number of audio input channels */
     virtual int         channelCount() const = 0;
-    
-    /** 
-     * return audio format in 8bit or 16bit PCM format - 
-     * eg. AudioSystem:PCM_16_BIT 
+
+    /**
+     * return audio format in 8bit or 16bit PCM format -
+     * eg. AudioSystem:PCM_16_BIT
      */
     virtual int         format() const = 0;
 
+    /**
+     * return the frame size (number of bytes per sample).
+     */
+    uint32_t    frameSize() const { return channelCount()*((format()==AudioSystem::PCM_16_BIT)?sizeof(int16_t):sizeof(int8_t)); }
+
     /** set the input gain for the audio driver. This method is for
      *  for future use */
     virtual status_t    setGain(float gain) = 0;
-    
+
     /** read audio buffer in from audio driver */
     virtual ssize_t     read(void* buffer, ssize_t bytes) = 0;
 
     /** dump the state of the audio input device */
     virtual status_t dump(int fd, const Vector<String16>& args) = 0;
+
+    /**
+     * Put the audio hardware input into standby mode. Returns
+     * status based on include/utils/Errors.h
+     */
+    virtual status_t    standby() = 0;
+
 };
 
-/** 
- * This defines the interface to the audio hardware abstraction layer. It 
- * supports setting and getting parameters, selecting audio routing paths and 
- * defining input and output streams.
- * 
- * AudioFlinger initializes the audio hardware and immediately opens an output 
- * stream. Audio routing can be set to output to handset, speaker, bluetooth or 
- * headset. 
+/**
+ * AudioHardwareInterface.h defines the interface to the audio hardware abstraction layer.
  *
- * The audio input stream is initialized when AudioFlinger is called to carry 
- * out a record operation. 
+ * The interface supports setting and getting parameters, selecting audio routing
+ * paths, and defining input and output streams.
+ *
+ * AudioFlinger initializes the audio hardware and immediately opens an output stream.
+ * You can set Audio routing to output to handset, speaker, Bluetooth, or a headset.
+ *
+ * The audio input stream is initialized when AudioFlinger is called to carry out
+ * a record operation.
  */
 class AudioHardwareInterface
 {
 public:
-                        AudioHardwareInterface();
-    virtual             ~AudioHardwareInterface() { }
-
-    /** 
-     * check to see if the audio hardware interface has been initialized. 
-     * return status based on values defined in include/utils/Errors.h 
+    /**
+     * check to see if the audio hardware interface has been initialized.
+     * return status based on values defined in include/utils/Errors.h
      */
     virtual status_t    initCheck() = 0;
 
-    /** 
-     * put the audio hardware into standby mode to conserve power. Returns 
-     * status based on include/utils/Errors.h 
+    /**
+     * put the audio hardware into standby mode to conserve power. Returns
+     * status based on include/utils/Errors.h
      */
     virtual status_t    standby() = 0;
 
     /** set the audio volume of a voice call. Range is between 0.0 and 1.0 */
     virtual status_t    setVoiceVolume(float volume) = 0;
-    
-    /** 
-     * set the audio volume for all audio activities other than voice call. 
-     * Range between 0.0 and 1.0. IF any value other than NO_ERROR is returned,
+
+    /**
+     * set the audio volume for all audio activities other than voice call.
+     * Range between 0.0 and 1.0. If any value other than NO_ERROR is returned,
      * the software mixer will emulate this capability.
      */
     virtual status_t    setMasterVolume(float volume) = 0;
 
-    /**  
-     * Audio routing methods. Routes defined in include/hardware/AudioSystem.h. 
-     * Audio routes can be (ROUTE_EARPIECE | ROUTE_SPEAKER | ROUTE_BLUETOOTH 
+    /**
+     * Audio routing methods. Routes defined in include/hardware/AudioSystem.h.
+     * Audio routes can be (ROUTE_EARPIECE | ROUTE_SPEAKER | ROUTE_BLUETOOTH
      *                    | ROUTE_HEADSET)
-     * 
+     *
      * setRouting sets the routes for a mode. This is called at startup. It is
-     * also called when a new device is connected, such as a wired headset is 
-     * plugged in or a Bluetooth headset is paired
+     * also called when a new device is connected, such as a wired headset is
+     * plugged in or a Bluetooth headset is paired.
      */
-    virtual status_t    setRouting(int mode, uint32_t routes);
-    
-    virtual status_t    getRouting(int mode, uint32_t* routes);
-    
+    virtual status_t    setRouting(int mode, uint32_t routes) = 0;
+
+    virtual status_t    getRouting(int mode, uint32_t* routes) = 0;
+
     /**
      * setMode is called when the audio mode changes. NORMAL mode is for
-     * standard audio playback, RINGTONE when a ringtone is playing and IN_CALL
+     * standard audio playback, RINGTONE when a ringtone is playing, and IN_CALL
      * when a call is in progress.
      */
-    virtual status_t    setMode(int mode);
-    virtual status_t    getMode(int* mode);
+    virtual status_t    setMode(int mode) = 0;
+    virtual status_t    getMode(int* mode) = 0;
 
     // mic mute
     virtual status_t    setMicMute(bool state) = 0;
@@ -171,38 +193,41 @@
 
     // Temporary interface, do not use
     // TODO: Replace with a more generic key:value get/set mechanism
-    virtual status_t    setParameter(const char* key, const char* value);
+    virtual status_t    setParameter(const char* key, const char* value) = 0;
 
+    // Returns audio input buffer size according to parameters passed or 0 if one of the
+    // parameters is not supported
+    virtual size_t    getInputBufferSize(uint32_t sampleRate, int format, int channelCount) = 0;
+    
     /** This method creates and opens the audio hardware output stream */
     virtual AudioStreamOut* openOutputStream(
                                 int format=0,
                                 int channelCount=0,
-                                uint32_t sampleRate=0) = 0;
+                                uint32_t sampleRate=0,
+                                status_t *status=0) = 0;
 
     /** This method creates and opens the audio hardware input stream */
     virtual AudioStreamIn* openInputStream(
                                 int format,
                                 int channelCount,
-                                uint32_t sampleRate) = 0;
-    
+                                uint32_t sampleRate,
+                                status_t *status) = 0;
+
     /**This method dumps the state of the audio hardware */
-    virtual status_t dumpState(int fd, const Vector<String16>& args);
+    virtual status_t dumpState(int fd, const Vector<String16>& args) = 0;
 
     static AudioHardwareInterface* create();
 
 protected:
     /**
-     * doRouting actually initiates the routing to occur. A call to setRouting 
-     * or setMode may result in a routing change. The generic logic will call 
+     * doRouting actually initiates the routing. A call to setRouting
+     * or setMode may result in a routing change. The generic logic calls
      * doRouting when required. If the device has any special requirements these
      * methods can be overriden.
      */
     virtual status_t    doRouting() = 0;
-    
-    virtual status_t dump(int fd, const Vector<String16>& args) = 0;
 
-    int             mMode;
-    uint32_t        mRoutes[AudioSystem::NUM_MODES];
+    virtual status_t dump(int fd, const Vector<String16>& args) = 0;
 };
 
 // ----------------------------------------------------------------------------
