Fix issue 2001214: AudioFlinger and AudioPolicyService interfaces should not use pointers as handles to inputs and outputs.

Use integers instead of void* as input/output handles at IAudioFlinger and IAudioPolicyService interfaces.
AudioFlinger maintains an always increasing count of opened inputs or outputs as unique ID.
diff --git a/include/media/AudioSystem.h b/include/media/AudioSystem.h
index 1243502..1f726fe 100644
--- a/include/media/AudioSystem.h
+++ b/include/media/AudioSystem.h
@@ -24,7 +24,7 @@
 namespace android {
 
 typedef void (*audio_error_callback)(status_t err);
-typedef void * audio_io_handle_t;
+typedef int audio_io_handle_t;
 
 class IAudioPolicyService;
 class String8;
@@ -184,8 +184,8 @@
     static status_t getMasterMute(bool* mute);
 
     // set/get stream volume on specified output
-    static status_t setStreamVolume(int stream, float value, void *output);
-    static status_t getStreamVolume(int stream, float* volume, void *output);
+    static status_t setStreamVolume(int stream, float value, int output);
+    static status_t getStreamVolume(int stream, float* volume, int output);
 
     // mute/unmute stream
     static status_t setStreamMute(int stream, bool mute);
@@ -383,7 +383,7 @@
 
         // indicate a change in the configuration of an output or input: keeps the cached
         // values for output/input parameters upto date in client process
-        virtual void ioConfigChanged(int event, void *param1, void *param2);
+        virtual void ioConfigChanged(int event, int ioHandle, void *param2);
     };
 
     class AudioPolicyServiceClient: public IBinder::DeathRecipient
diff --git a/include/media/IAudioFlinger.h b/include/media/IAudioFlinger.h
index 26e6972..8018568 100644
--- a/include/media/IAudioFlinger.h
+++ b/include/media/IAudioFlinger.h
@@ -50,12 +50,12 @@
                                 int frameCount,
                                 uint32_t flags,
                                 const sp<IMemory>& sharedBuffer,
-                                void *output,
+                                int output,
                                 status_t *status) = 0;
 
     virtual sp<IAudioRecord> openRecord(
                                 pid_t pid,
-                                void *input,
+                                int input,
                                 uint32_t sampleRate,
                                 int format,
                                 int channelCount,
@@ -66,11 +66,11 @@
     /* query the audio hardware state. This state never changes,
      * and therefore can be cached.
      */
-    virtual     uint32_t    sampleRate(void *output) const = 0;
-    virtual     int         channelCount(void *output) const = 0;
-    virtual     int         format(void *output) const = 0;
-    virtual     size_t      frameCount(void *output) const = 0;
-    virtual     uint32_t    latency(void *output) const = 0;
+    virtual     uint32_t    sampleRate(int output) const = 0;
+    virtual     int         channelCount(int output) const = 0;
+    virtual     int         format(int output) const = 0;
+    virtual     size_t      frameCount(int output) const = 0;
+    virtual     uint32_t    latency(int output) const = 0;
 
     /* set/get the audio hardware state. This will probably be used by
      * the preference panel, mostly.
@@ -84,10 +84,10 @@
     /* set/get stream type state. This will probably be used by
      * the preference panel, mostly.
      */
-    virtual     status_t    setStreamVolume(int stream, float value, void *output) = 0;
+    virtual     status_t    setStreamVolume(int stream, float value, int output) = 0;
     virtual     status_t    setStreamMute(int stream, bool muted) = 0;
 
-    virtual     float       streamVolume(int stream, void *output) const = 0;
+    virtual     float       streamVolume(int stream, int output) const = 0;
     virtual     bool        streamMute(int stream) const = 0;
 
     // set audio mode
@@ -100,8 +100,8 @@
     // is a music stream active?
     virtual     bool        isMusicActive() const = 0;
 
-    virtual     status_t    setParameters(void *ioHandle, const String8& keyValuePairs) = 0;
-    virtual     String8     getParameters(void *ioHandle, const String8& keys) = 0;
+    virtual     status_t    setParameters(int ioHandle, const String8& keyValuePairs) = 0;
+    virtual     String8     getParameters(int ioHandle, const String8& keys) = 0;
     
     // register a current process for audio output change notifications
     virtual void registerClient(const sp<IAudioFlingerClient>& client) = 0;
@@ -109,25 +109,25 @@
     // retrieve the audio recording buffer size
     virtual size_t getInputBufferSize(uint32_t sampleRate, int format, int channelCount) = 0;
 
-    virtual void *openOutput(uint32_t *pDevices,
+    virtual int openOutput(uint32_t *pDevices,
                                     uint32_t *pSamplingRate,
                                     uint32_t *pFormat,
                                     uint32_t *pChannels,
                                     uint32_t *pLatencyMs,
                                     uint32_t flags) = 0;
-    virtual void *openDuplicateOutput(void *output1, void *output2) = 0;
-    virtual status_t closeOutput(void *output) = 0;
-    virtual status_t suspendOutput(void *output) = 0;
-    virtual status_t restoreOutput(void *output) = 0;
+    virtual int openDuplicateOutput(int output1, int output2) = 0;
+    virtual status_t closeOutput(int output) = 0;
+    virtual status_t suspendOutput(int output) = 0;
+    virtual status_t restoreOutput(int output) = 0;
 
-    virtual void *openInput(uint32_t *pDevices,
+    virtual int openInput(uint32_t *pDevices,
                                     uint32_t *pSamplingRate,
                                     uint32_t *pFormat,
                                     uint32_t *pChannels,
                                     uint32_t acoustics) = 0;
-    virtual status_t closeInput(void *input) = 0;
+    virtual status_t closeInput(int input) = 0;
 
-    virtual status_t setStreamOutput(uint32_t stream, void *output) = 0;
+    virtual status_t setStreamOutput(uint32_t stream, int output) = 0;
 };
 
 
diff --git a/include/media/IAudioFlingerClient.h b/include/media/IAudioFlingerClient.h
index 78142ce..aa0cdcf 100644
--- a/include/media/IAudioFlingerClient.h
+++ b/include/media/IAudioFlingerClient.h
@@ -32,7 +32,7 @@
     DECLARE_META_INTERFACE(AudioFlingerClient);
 
     // Notifies a change of audio input/output configuration.
-    virtual void ioConfigChanged(int event, void *param1, void *param2) = 0;
+    virtual void ioConfigChanged(int event, int ioHandle, void *param2) = 0;
 
 };
 
diff --git a/media/libmedia/AudioSystem.cpp b/media/libmedia/AudioSystem.cpp
index 1fc1024..98b55e9 100644
--- a/media/libmedia/AudioSystem.cpp
+++ b/media/libmedia/AudioSystem.cpp
@@ -125,7 +125,7 @@
     return NO_ERROR;
 }
 
-status_t AudioSystem::setStreamVolume(int stream, float value, void *output)
+status_t AudioSystem::setStreamVolume(int stream, float value, int output)
 {
     if (uint32_t(stream) >= NUM_STREAM_TYPES) return BAD_VALUE;
     const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
@@ -143,7 +143,7 @@
     return NO_ERROR;
 }
 
-status_t AudioSystem::getStreamVolume(int stream, float* volume, void *output)
+status_t AudioSystem::getStreamVolume(int stream, float* volume, int output)
 {
     if (uint32_t(stream) >= NUM_STREAM_TYPES) return BAD_VALUE;
     const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
@@ -234,7 +234,7 @@
     gLock.lock();
     outputDesc = AudioSystem::gOutputs.valueFor(output);
     if (outputDesc == 0) {
-        LOGV("getOutputSamplingRate() no output descriptor for output %p in gOutputs", output);
+        LOGV("getOutputSamplingRate() no output descriptor for output %d in gOutputs", output);
         gLock.unlock();
         const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
         if (af == 0) return PERMISSION_DENIED;
@@ -245,7 +245,7 @@
         gLock.unlock();
     }
 
-    LOGV("getOutputSamplingRate() streamType %d, output %p, sampling rate %d", streamType, output, *samplingRate);
+    LOGV("getOutputSamplingRate() streamType %d, output %d, sampling rate %d", streamType, output, *samplingRate);
 
     return NO_ERROR;
 }
@@ -276,7 +276,7 @@
         gLock.unlock();
     }
 
-    LOGV("getOutputFrameCount() streamType %d, output %p, frameCount %d", streamType, output, *frameCount);
+    LOGV("getOutputFrameCount() streamType %d, output %d, frameCount %d", streamType, output, *frameCount);
 
     return NO_ERROR;
 }
@@ -307,7 +307,7 @@
         gLock.unlock();
     }
 
-    LOGV("getOutputLatency() streamType %d, output %p, latency %d", streamType, output, *latency);
+    LOGV("getOutputLatency() streamType %d, output %d, latency %d", streamType, output, *latency);
 
     return NO_ERROR;
 }
@@ -348,13 +348,12 @@
     LOGW("AudioFlinger server died!");
 }
 
-void AudioSystem::AudioFlingerClient::ioConfigChanged(int event, void *param1, void *param2) {
+void AudioSystem::AudioFlingerClient::ioConfigChanged(int event, int ioHandle, void *param2) {
     LOGV("ioConfigChanged() event %d", event);
-    audio_io_handle_t ioHandle = (audio_io_handle_t)param1;
     OutputDescriptor *desc;
     uint32_t stream;
 
-    if (param1 == 0) return;
+    if (ioHandle == 0) return;
 
     Mutex::Autolock _l(AudioSystem::gLock);
 
@@ -362,14 +361,14 @@
     case STREAM_CONFIG_CHANGED:
         if (param2 == 0) break;
         stream = *(uint32_t *)param2;
-        LOGV("ioConfigChanged() STREAM_CONFIG_CHANGED stream %d, output %p", stream, ioHandle);
+        LOGV("ioConfigChanged() STREAM_CONFIG_CHANGED stream %d, output %d", stream, ioHandle);
         if (gStreamOutputMap.indexOfKey(stream) >= 0) {
             gStreamOutputMap.replaceValueFor(stream, ioHandle);
         }
         break;
     case OUTPUT_OPENED: {
         if (gOutputs.indexOfKey(ioHandle) >= 0) {
-            LOGV("ioConfigChanged() opening already existing output! %p", ioHandle);
+            LOGV("ioConfigChanged() opening already existing output! %d", ioHandle);
             break;
         }
         if (param2 == 0) break;
@@ -382,10 +381,10 @@
         } break;
     case OUTPUT_CLOSED: {
         if (gOutputs.indexOfKey(ioHandle) < 0) {
-            LOGW("ioConfigChanged() closing unknow output! %p", ioHandle);
+            LOGW("ioConfigChanged() closing unknow output! %d", ioHandle);
             break;
         }
-        LOGV("ioConfigChanged() output %p closed", ioHandle);
+        LOGV("ioConfigChanged() output %d closed", ioHandle);
 
         gOutputs.removeItem(ioHandle);
         for (int i = gStreamOutputMap.size() - 1; i >= 0 ; i--) {
@@ -398,13 +397,13 @@
     case OUTPUT_CONFIG_CHANGED: {
         int index = gOutputs.indexOfKey(ioHandle);
         if (index < 0) {
-            LOGW("ioConfigChanged() modifying unknow output! %p", ioHandle);
+            LOGW("ioConfigChanged() modifying unknow output! %d", ioHandle);
             break;
         }
         if (param2 == 0) break;
         desc = (OutputDescriptor *)param2;
 
-        LOGV("ioConfigChanged() new config for output %p samplingRate %d, format %d channels %d frameCount %d latency %d",
+        LOGV("ioConfigChanged() new config for output %d samplingRate %d, format %d channels %d frameCount %d latency %d",
                 ioHandle, desc->samplingRate, desc->format,
                 desc->channels, desc->frameCount, desc->latency);
         OutputDescriptor *outputDesc = gOutputs.valueAt(index);
@@ -524,15 +523,15 @@
                                     uint32_t channels,
                                     output_flags flags)
 {
-    audio_io_handle_t output = NULL;
+    audio_io_handle_t output = 0;
     if ((flags & AudioSystem::OUTPUT_FLAG_DIRECT) == 0) {
         Mutex::Autolock _l(gLock);
         output = AudioSystem::gStreamOutputMap.valueFor(stream);
-        LOGV_IF((output != NULL), "getOutput() read %p from cache for stream %d", output, stream);
+        LOGV_IF((output != 0), "getOutput() read %d from cache for stream %d", output, stream);
     }
-    if (output == NULL) {
+    if (output == 0) {
         const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
-        if (aps == 0) return NULL;
+        if (aps == 0) return 0;
         output = aps->getOutput(stream, samplingRate, format, channels, flags);
         if ((flags & AudioSystem::OUTPUT_FLAG_DIRECT) == 0) {
             Mutex::Autolock _l(gLock);
@@ -570,7 +569,7 @@
                                     audio_in_acoustics acoustics)
 {
     const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
-    if (aps == 0) return NULL;
+    if (aps == 0) return 0;
     return aps->getInput(inputSource, samplingRate, format, channels, acoustics);
 }
 
diff --git a/media/libmedia/IAudioFlinger.cpp b/media/libmedia/IAudioFlinger.cpp
index 9385367..fc39a46 100644
--- a/media/libmedia/IAudioFlinger.cpp
+++ b/media/libmedia/IAudioFlinger.cpp
@@ -79,7 +79,7 @@
                                 int frameCount,
                                 uint32_t flags,
                                 const sp<IMemory>& sharedBuffer,
-                                void *output,
+                                int output,
                                 status_t *status)
     {
         Parcel data, reply;
@@ -92,7 +92,7 @@
         data.writeInt32(frameCount);
         data.writeInt32(flags);
         data.writeStrongBinder(sharedBuffer->asBinder());
-        data.write(&output, sizeof(void *));
+        data.writeInt32(output);
         status_t lStatus = remote()->transact(CREATE_TRACK, data, &reply);
         if (lStatus != NO_ERROR) {
             LOGE("createTrack error: %s", strerror(-lStatus));
@@ -106,7 +106,7 @@
 
     virtual sp<IAudioRecord> openRecord(
                                 pid_t pid,
-                                void *input,
+                                int input,
                                 uint32_t sampleRate,
                                 int format,
                                 int channelCount,
@@ -117,7 +117,7 @@
         Parcel data, reply;
         data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
         data.writeInt32(pid);
-        data.write(&input, sizeof(void *));
+        data.writeInt32(input);
         data.writeInt32(sampleRate);
         data.writeInt32(format);
         data.writeInt32(channelCount);
@@ -131,47 +131,47 @@
         return interface_cast<IAudioRecord>(reply.readStrongBinder());
     }
 
-    virtual uint32_t sampleRate(void *output) const
+    virtual uint32_t sampleRate(int output) const
     {
         Parcel data, reply;
         data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
-        data.write(&output, sizeof(void *));
+        data.writeInt32(output);
         remote()->transact(SAMPLE_RATE, data, &reply);
         return reply.readInt32();
     }
 
-    virtual int channelCount(void *output) const
+    virtual int channelCount(int output) const
     {
         Parcel data, reply;
         data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
-        data.write(&output, sizeof(void *));
+        data.writeInt32(output);
         remote()->transact(CHANNEL_COUNT, data, &reply);
         return reply.readInt32();
     }
 
-    virtual int format(void *output) const
+    virtual int format(int output) const
     {
         Parcel data, reply;
         data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
-        data.write(&output, sizeof(void *));
+        data.writeInt32(output);
         remote()->transact(FORMAT, data, &reply);
         return reply.readInt32();
     }
 
-    virtual size_t frameCount(void *output) const
+    virtual size_t frameCount(int output) const
     {
         Parcel data, reply;
         data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
-        data.write(&output, sizeof(void *));
+        data.writeInt32(output);
         remote()->transact(FRAME_COUNT, data, &reply);
         return reply.readInt32();
     }
 
-    virtual uint32_t latency(void *output) const
+    virtual uint32_t latency(int output) const
     {
         Parcel data, reply;
         data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
-        data.write(&output, sizeof(void *));
+        data.writeInt32(output);
         remote()->transact(LATENCY, data, &reply);
         return reply.readInt32();
     }
@@ -210,13 +210,13 @@
         return reply.readInt32();
     }
 
-    virtual status_t setStreamVolume(int stream, float value, void *output)
+    virtual status_t setStreamVolume(int stream, float value, int output)
     {
         Parcel data, reply;
         data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
         data.writeInt32(stream);
         data.writeFloat(value);
-        data.write(&output, sizeof(void *));
+        data.writeInt32(output);
         remote()->transact(SET_STREAM_VOLUME, data, &reply);
         return reply.readInt32();
     }
@@ -231,12 +231,12 @@
         return reply.readInt32();
     }
 
-    virtual float streamVolume(int stream, void *output) const
+    virtual float streamVolume(int stream, int output) const
     {
         Parcel data, reply;
         data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
         data.writeInt32(stream);
-        data.write(&output, sizeof(void *));
+        data.writeInt32(output);
         remote()->transact(STREAM_VOLUME, data, &reply);
         return reply.readFloat();
     }
@@ -284,21 +284,21 @@
         return reply.readInt32();
     }
 
-    virtual status_t setParameters(void *ioHandle, const String8& keyValuePairs)
+    virtual status_t setParameters(int ioHandle, const String8& keyValuePairs)
     {
         Parcel data, reply;
         data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
-        data.write(&ioHandle, sizeof(void *));
+        data.writeInt32(ioHandle);
         data.writeString8(keyValuePairs);
         remote()->transact(SET_PARAMETERS, data, &reply);
         return reply.readInt32();
     }
 
-    virtual String8 getParameters(void *ioHandle, const String8& keys)
+    virtual String8 getParameters(int ioHandle, const String8& keys)
     {
         Parcel data, reply;
         data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
-        data.write(&ioHandle, sizeof(void *));
+        data.writeInt32(ioHandle);
         data.writeString8(keys);
         remote()->transact(GET_PARAMETERS, data, &reply);
         return reply.readString8();
@@ -323,7 +323,7 @@
         return reply.readInt32();
     }
 
-    virtual void *openOutput(uint32_t *pDevices,
+    virtual int openOutput(uint32_t *pDevices,
                             uint32_t *pSamplingRate,
                             uint32_t *pFormat,
                             uint32_t *pChannels,
@@ -345,8 +345,7 @@
         data.writeInt32(latency);
         data.writeInt32(flags);
         remote()->transact(OPEN_OUTPUT, data, &reply);
-        void *output;
-        reply.read(&output, sizeof(void *));
+        int  output = reply.readInt32();
         LOGV("openOutput() returned output, %p", output);
         devices = reply.readInt32();
         if (pDevices) *pDevices = devices;
@@ -361,50 +360,48 @@
         return output;
     }
 
-    virtual void *openDuplicateOutput(void *output1, void *output2)
+    virtual int openDuplicateOutput(int output1, int output2)
     {
         Parcel data, reply;
         data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
-        data.write(&output1, sizeof(void *));
-        data.write(&output2, sizeof(void *));
+        data.writeInt32(output1);
+        data.writeInt32(output2);
         remote()->transact(OPEN_DUPLICATE_OUTPUT, data, &reply);
-        void *output;
-        reply.read(&output, sizeof(void *));
-        return output;
+        return reply.readInt32();
     }
 
-    virtual status_t closeOutput(void *output)
+    virtual status_t closeOutput(int output)
     {
         Parcel data, reply;
         data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
-        data.write(&output, sizeof(void *));
+        data.writeInt32(output);
         remote()->transact(CLOSE_OUTPUT, data, &reply);
         return reply.readInt32();
     }
 
-    virtual status_t suspendOutput(void *output)
+    virtual status_t suspendOutput(int output)
     {
         Parcel data, reply;
         data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
-        data.write(&output, sizeof(void *));
+        data.writeInt32(output);
         remote()->transact(SUSPEND_OUTPUT, data, &reply);
         return reply.readInt32();
     }
 
-    virtual status_t restoreOutput(void *output)
+    virtual status_t restoreOutput(int output)
     {
         Parcel data, reply;
         data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
-        data.write(&output, sizeof(void *));
+        data.writeInt32(output);
         remote()->transact(RESTORE_OUTPUT, data, &reply);
         return reply.readInt32();
     }
 
-    virtual void *openInput(uint32_t *pDevices,
-                                        uint32_t *pSamplingRate,
-                                        uint32_t *pFormat,
-                                        uint32_t *pChannels,
-                                        uint32_t acoustics)
+    virtual int openInput(uint32_t *pDevices,
+                            uint32_t *pSamplingRate,
+                            uint32_t *pFormat,
+                            uint32_t *pChannels,
+                            uint32_t acoustics)
     {
         Parcel data, reply;
         uint32_t devices = pDevices ? *pDevices : 0;
@@ -419,8 +416,7 @@
         data.writeInt32(channels);
         data.writeInt32(acoustics);
         remote()->transact(OPEN_INPUT, data, &reply);
-        void *input;
-        reply.read(&input, sizeof(void *));
+        int input = reply.readInt32();
         devices = reply.readInt32();
         if (pDevices) *pDevices = devices;
         samplingRate = reply.readInt32();
@@ -432,21 +428,21 @@
         return input;
     }
 
-    virtual status_t closeInput(void *input)
+    virtual status_t closeInput(int input)
     {
         Parcel data, reply;
         data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
-        data.write(&input, sizeof(void *));
+        data.writeInt32(input);
         remote()->transact(CLOSE_INPUT, data, &reply);
         return reply.readInt32();
     }
 
-    virtual status_t setStreamOutput(uint32_t stream, void *output)
+    virtual status_t setStreamOutput(uint32_t stream, int output)
     {
         Parcel data, reply;
         data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
         data.writeInt32(stream);
-        data.write(&output, sizeof(void *));
+        data.writeInt32(output);
         remote()->transact(SET_STREAM_OUTPUT, data, &reply);
         return reply.readInt32();
     }
@@ -470,8 +466,7 @@
             size_t bufferCount = data.readInt32();
             uint32_t flags = data.readInt32();
             sp<IMemory> buffer = interface_cast<IMemory>(data.readStrongBinder());
-            void *output;
-            data.read(&output, sizeof(void *));
+            int output = data.readInt32();
             status_t status;
             sp<IAudioTrack> track = createTrack(pid,
                     streamType, sampleRate, format,
@@ -483,8 +478,7 @@
         case OPEN_RECORD: {
             CHECK_INTERFACE(IAudioFlinger, data, reply);
             pid_t pid = data.readInt32();
-            void *input;
-            data.read(&input, sizeof(void *));
+            int input = data.readInt32();
             uint32_t sampleRate = data.readInt32();
             int format = data.readInt32();
             int channelCount = data.readInt32();
@@ -499,37 +493,27 @@
         } break;
         case SAMPLE_RATE: {
             CHECK_INTERFACE(IAudioFlinger, data, reply);
-            void *output;
-            data.read(&output, sizeof(void *));
-            reply->writeInt32( sampleRate(output) );
+            reply->writeInt32( sampleRate(data.readInt32()) );
             return NO_ERROR;
         } break;
         case CHANNEL_COUNT: {
             CHECK_INTERFACE(IAudioFlinger, data, reply);
-            void *output;
-            data.read(&output, sizeof(void *));
-            reply->writeInt32( channelCount(output) );
+            reply->writeInt32( channelCount(data.readInt32()) );
             return NO_ERROR;
         } break;
         case FORMAT: {
             CHECK_INTERFACE(IAudioFlinger, data, reply);
-            void *output;
-            data.read(&output, sizeof(void *));
-            reply->writeInt32( format(output) );
+            reply->writeInt32( format(data.readInt32()) );
             return NO_ERROR;
         } break;
         case FRAME_COUNT: {
             CHECK_INTERFACE(IAudioFlinger, data, reply);
-            void *output;
-            data.read(&output, sizeof(void *));
-            reply->writeInt32( frameCount(output) );
+            reply->writeInt32( frameCount(data.readInt32()) );
             return NO_ERROR;
         } break;
         case LATENCY: {
             CHECK_INTERFACE(IAudioFlinger, data, reply);
-            void *output;
-            data.read(&output, sizeof(void *));
-            reply->writeInt32( latency(output) );
+            reply->writeInt32( latency(data.readInt32()) );
             return NO_ERROR;
         } break;
          case SET_MASTER_VOLUME: {
@@ -556,8 +540,7 @@
             CHECK_INTERFACE(IAudioFlinger, data, reply);
             int stream = data.readInt32();
             float volume = data.readFloat();
-            void *output;
-            data.read(&output, sizeof(void *));
+            int output = data.readInt32();
             reply->writeInt32( setStreamVolume(stream, volume, output) );
             return NO_ERROR;
         } break;
@@ -570,8 +553,7 @@
         case STREAM_VOLUME: {
             CHECK_INTERFACE(IAudioFlinger, data, reply);
             int stream = data.readInt32();
-            void *output;
-            data.read(&output, sizeof(void *));
+            int output = data.readInt32();
             reply->writeFloat( streamVolume(stream, output) );
             return NO_ERROR;
         } break;
@@ -605,16 +587,14 @@
         } break;
         case SET_PARAMETERS: {
             CHECK_INTERFACE(IAudioFlinger, data, reply);
-            void *ioHandle;
-            data.read(&ioHandle, sizeof(void *));
+            int ioHandle = data.readInt32();
             String8 keyValuePairs(data.readString8());
             reply->writeInt32(setParameters(ioHandle, keyValuePairs));
             return NO_ERROR;
          } break;
         case GET_PARAMETERS: {
             CHECK_INTERFACE(IAudioFlinger, data, reply);
-            void *ioHandle;
-            data.read(&ioHandle, sizeof(void *));
+            int ioHandle = data.readInt32();
             String8 keys(data.readString8());
             reply->writeString8(getParameters(ioHandle, keys));
             return NO_ERROR;
@@ -642,14 +622,14 @@
             uint32_t channels = data.readInt32();
             uint32_t latency = data.readInt32();
             uint32_t flags = data.readInt32();
-            void *output = openOutput(&devices,
+            int output = openOutput(&devices,
                                      &samplingRate,
                                      &format,
                                      &channels,
                                      &latency,
                                      flags);
             LOGV("OPEN_OUTPUT output, %p", output);
-            reply->write(&output, sizeof(void *));
+            reply->writeInt32(output);
             reply->writeInt32(devices);
             reply->writeInt32(samplingRate);
             reply->writeInt32(format);
@@ -659,33 +639,24 @@
         } break;
         case OPEN_DUPLICATE_OUTPUT: {
             CHECK_INTERFACE(IAudioFlinger, data, reply);
-            void *output1;
-            void *output2;
-            data.read(&output1, sizeof(void *));
-            data.read(&output2, sizeof(void *));
-            void *output = openDuplicateOutput(output1, output2);
-            reply->write(&output, sizeof(void *));
+            int output1 = data.readInt32();
+            int output2 = data.readInt32();
+            reply->writeInt32(openDuplicateOutput(output1, output2));
             return NO_ERROR;
         } break;
         case CLOSE_OUTPUT: {
             CHECK_INTERFACE(IAudioFlinger, data, reply);
-            void *output;
-            data.read(&output, sizeof(void *));
-            reply->writeInt32(closeOutput(output));
+            reply->writeInt32(closeOutput(data.readInt32()));
             return NO_ERROR;
         } break;
         case SUSPEND_OUTPUT: {
             CHECK_INTERFACE(IAudioFlinger, data, reply);
-            void *output;
-            data.read(&output, sizeof(void *));
-            reply->writeInt32(suspendOutput(output));
+            reply->writeInt32(suspendOutput(data.readInt32()));
             return NO_ERROR;
         } break;
         case RESTORE_OUTPUT: {
             CHECK_INTERFACE(IAudioFlinger, data, reply);
-            void *output;
-            data.read(&output, sizeof(void *));
-            reply->writeInt32(restoreOutput(output));
+            reply->writeInt32(restoreOutput(data.readInt32()));
             return NO_ERROR;
         } break;
         case OPEN_INPUT: {
@@ -696,12 +667,12 @@
             uint32_t channels = data.readInt32();
             uint32_t acoutics = data.readInt32();
 
-            void *input = openInput(&devices,
+            int input = openInput(&devices,
                                      &samplingRate,
                                      &format,
                                      &channels,
                                      acoutics);
-            reply->write(&input, sizeof(void *));
+            reply->writeInt32(input);
             reply->writeInt32(devices);
             reply->writeInt32(samplingRate);
             reply->writeInt32(format);
@@ -710,16 +681,13 @@
         } break;
         case CLOSE_INPUT: {
             CHECK_INTERFACE(IAudioFlinger, data, reply);
-            void *input;
-            data.read(&input, sizeof(void *));
-            reply->writeInt32(closeInput(input));
+            reply->writeInt32(closeInput(data.readInt32()));
             return NO_ERROR;
         } break;
         case SET_STREAM_OUTPUT: {
             CHECK_INTERFACE(IAudioFlinger, data, reply);
-            void *output;
             uint32_t stream = data.readInt32();
-            data.read(&output, sizeof(void *));
+            int output = data.readInt32();
             reply->writeInt32(setStreamOutput(stream, output));
             return NO_ERROR;
         } break;
diff --git a/media/libmedia/IAudioFlingerClient.cpp b/media/libmedia/IAudioFlingerClient.cpp
index eaae977..3900de4 100644
--- a/media/libmedia/IAudioFlingerClient.cpp
+++ b/media/libmedia/IAudioFlingerClient.cpp
@@ -39,12 +39,12 @@
     {
     }
 
-    void ioConfigChanged(int event, void *param1, void *param2)
+    void ioConfigChanged(int event, int ioHandle, void *param2)
     {
         Parcel data, reply;
         data.writeInterfaceToken(IAudioFlingerClient::getInterfaceDescriptor());
         data.writeInt32(event);
-        data.write(&param1, sizeof(void *));
+        data.writeInt32(ioHandle);
         if (event == AudioSystem::STREAM_CONFIG_CHANGED) {
             uint32_t stream = *(uint32_t *)param2;
             LOGV("ioConfigChanged stream %d", stream);
@@ -72,11 +72,10 @@
     case IO_CONFIG_CHANGED: {
             CHECK_INTERFACE(IAudioFlingerClient, data, reply);
             int event = data.readInt32();
-            void *param1;
+            int ioHandle = data.readInt32();
             void *param2 = 0;
             AudioSystem::OutputDescriptor desc;
             uint32_t stream;
-            data.read(&param1, sizeof(void *));
             if (event == AudioSystem::STREAM_CONFIG_CHANGED) {
                 stream = data.readInt32();
                 param2 = &stream;
@@ -89,7 +88,7 @@
                 desc.latency = data.readInt32();
                 param2 = &desc;
             }
-            ioConfigChanged(event, param1, param2);
+            ioConfigChanged(event, ioHandle, param2);
             return NO_ERROR;
         } break;
         default:
diff --git a/media/libmedia/IAudioPolicyService.cpp b/media/libmedia/IAudioPolicyService.cpp
index 0d8a329..18dd173 100644
--- a/media/libmedia/IAudioPolicyService.cpp
+++ b/media/libmedia/IAudioPolicyService.cpp
@@ -134,16 +134,14 @@
         data.writeInt32(channels);
         data.writeInt32(static_cast <uint32_t>(flags));
         remote()->transact(GET_OUTPUT, data, &reply);
-        audio_io_handle_t output;
-        reply.read(&output, sizeof(audio_io_handle_t));
-        return output;
+        return static_cast <audio_io_handle_t> (reply.readInt32());
     }
 
     virtual status_t startOutput(audio_io_handle_t output, AudioSystem::stream_type stream)
     {
         Parcel data, reply;
         data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
-        data.write(&output, sizeof(audio_io_handle_t));
+        data.writeInt32(output);
         data.writeInt32(stream);
         remote()->transact(START_OUTPUT, data, &reply);
         return static_cast <status_t> (reply.readInt32());
@@ -153,7 +151,7 @@
     {
         Parcel data, reply;
         data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
-        data.write(&output, sizeof(audio_io_handle_t));
+        data.writeInt32(output);
         data.writeInt32(stream);
         remote()->transact(STOP_OUTPUT, data, &reply);
         return static_cast <status_t> (reply.readInt32());
@@ -163,7 +161,7 @@
     {
         Parcel data, reply;
         data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
-        data.write(&output, sizeof(audio_io_handle_t));
+        data.writeInt32(output);
         remote()->transact(RELEASE_OUTPUT, data, &reply);
     }
 
@@ -182,16 +180,14 @@
         data.writeInt32(channels);
         data.writeInt32(static_cast <uint32_t>(acoustics));
         remote()->transact(GET_INPUT, data, &reply);
-        audio_io_handle_t input;
-        reply.read(&input, sizeof(audio_io_handle_t));
-        return input;
+        return static_cast <audio_io_handle_t> (reply.readInt32());
     }
 
     virtual status_t startInput(audio_io_handle_t input)
     {
         Parcel data, reply;
         data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
-        data.write(&input, sizeof(audio_io_handle_t));
+        data.writeInt32(input);
         remote()->transact(START_INPUT, data, &reply);
         return static_cast <status_t> (reply.readInt32());
     }
@@ -200,7 +196,7 @@
     {
         Parcel data, reply;
         data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
-        data.write(&input, sizeof(audio_io_handle_t));
+        data.writeInt32(input);
         remote()->transact(STOP_INPUT, data, &reply);
         return static_cast <status_t> (reply.readInt32());
     }
@@ -209,7 +205,7 @@
     {
         Parcel data, reply;
         data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
-        data.write(&input, sizeof(audio_io_handle_t));
+        data.writeInt32(input);
         remote()->transact(RELEASE_INPUT, data, &reply);
     }
 
@@ -316,14 +312,13 @@
                                                  format,
                                                  channels,
                                                  flags);
-            reply->write(&output, sizeof(audio_io_handle_t));
+            reply->writeInt32(static_cast <int>(output));
             return NO_ERROR;
         } break;
 
         case START_OUTPUT: {
             CHECK_INTERFACE(IAudioPolicyService, data, reply);
-            audio_io_handle_t output;
-            data.read(&output, sizeof(audio_io_handle_t));
+            audio_io_handle_t output = static_cast <audio_io_handle_t>(data.readInt32());
             uint32_t stream = data.readInt32();
             reply->writeInt32(static_cast <uint32_t>(startOutput(output, (AudioSystem::stream_type)stream)));
             return NO_ERROR;
@@ -331,8 +326,7 @@
 
         case STOP_OUTPUT: {
             CHECK_INTERFACE(IAudioPolicyService, data, reply);
-            audio_io_handle_t output;
-            data.read(&output, sizeof(audio_io_handle_t));
+            audio_io_handle_t output = static_cast <audio_io_handle_t>(data.readInt32());
             uint32_t stream = data.readInt32();
             reply->writeInt32(static_cast <uint32_t>(stopOutput(output, (AudioSystem::stream_type)stream)));
             return NO_ERROR;
@@ -340,8 +334,7 @@
 
         case RELEASE_OUTPUT: {
             CHECK_INTERFACE(IAudioPolicyService, data, reply);
-            audio_io_handle_t output;
-            data.read(&output, sizeof(audio_io_handle_t));
+            audio_io_handle_t output = static_cast <audio_io_handle_t>(data.readInt32());
             releaseOutput(output);
             return NO_ERROR;
         } break;
@@ -358,30 +351,27 @@
                                                format,
                                                channels,
                                                acoustics);
-            reply->write(&input, sizeof(audio_io_handle_t));
+            reply->writeInt32(static_cast <int>(input));
             return NO_ERROR;
         } break;
 
         case START_INPUT: {
             CHECK_INTERFACE(IAudioPolicyService, data, reply);
-            audio_io_handle_t input;
-            data.read(&input, sizeof(audio_io_handle_t));
+            audio_io_handle_t input = static_cast <audio_io_handle_t>(data.readInt32());
             reply->writeInt32(static_cast <uint32_t>(startInput(input)));
             return NO_ERROR;
         } break;
 
         case STOP_INPUT: {
             CHECK_INTERFACE(IAudioPolicyService, data, reply);
-            audio_io_handle_t input;
-            data.read(&input, sizeof(audio_io_handle_t));
+            audio_io_handle_t input = static_cast <audio_io_handle_t>(data.readInt32());
             reply->writeInt32(static_cast <uint32_t>(stopInput(input)));
             return NO_ERROR;
         } break;
 
         case RELEASE_INPUT: {
             CHECK_INTERFACE(IAudioPolicyService, data, reply);
-            audio_io_handle_t input;
-            data.read(&input, sizeof(audio_io_handle_t));
+            audio_io_handle_t input = static_cast <audio_io_handle_t>(data.readInt32());
             releaseInput(input);
             return NO_ERROR;
         } break;