| Index: ppapi/proxy/ppb_audio_input_proxy.cc | 
| diff --git a/ppapi/proxy/ppb_audio_input_proxy.cc b/ppapi/proxy/ppb_audio_input_proxy.cc | 
| index 011e332afcdbbbee92907a4eebd770134f245806..dfc2d0c176529ceea60035ecd37712b71d519144 100644 | 
| --- a/ppapi/proxy/ppb_audio_input_proxy.cc | 
| +++ b/ppapi/proxy/ppb_audio_input_proxy.cc | 
| @@ -5,6 +5,7 @@ | 
| #include "ppapi/proxy/ppb_audio_input_proxy.h" | 
|  | 
| #include "base/compiler_specific.h" | 
| +#include "media/audio/shared_memory_util.h" | 
| #include "ppapi/c/dev/ppb_audio_input_dev.h" | 
| #include "ppapi/c/pp_errors.h" | 
| #include "ppapi/c/ppb_audio_config.h" | 
| @@ -286,21 +287,27 @@ void PPB_AudioInput_Proxy::OnMsgEnumerateDevicesACK( | 
| void PPB_AudioInput_Proxy::OnMsgOpenACK( | 
| const HostResource& audio_input, | 
| int32_t result, | 
| -    IPC::PlatformFileForTransit socket_handle, | 
| -    base::SharedMemoryHandle handle, | 
| -    uint32_t length) { | 
| +    const ppapi::proxy::SerializedHandle& socket_handle, | 
| +    const ppapi::proxy::SerializedHandle& handle) { | 
| +  CHECK(socket_handle.is_socket()); | 
| +  CHECK(handle.is_shmem()); | 
| EnterPluginFromHostResource<PPB_AudioInput_API> enter(audio_input); | 
| if (enter.failed()) { | 
| // The caller may still have given us these handles in the failure case. | 
| // The easiest way to clean these up is to just put them in the objects | 
| // and then close them. This failure case is not performance critical. | 
| base::SyncSocket temp_socket( | 
| -        IPC::PlatformFileForTransitToPlatformFile(socket_handle)); | 
| -    base::SharedMemory temp_mem(handle, false); | 
| +        IPC::PlatformFileForTransitToPlatformFile( | 
| +            socket_handle.descriptor())); | 
| +    base::SharedMemory temp_mem(handle.shmem(), false); | 
| } else { | 
| +    // See the comment above about how we must call | 
| +    // TotalSharedMemorySizeInBytes to get the actual size of the buffer. Here, | 
| +    // we must call PacketSizeInBytes to get back the size of the audio buffer, | 
| +    // excluding the bytes that audio uses for book-keeping. | 
| static_cast<AudioInput*>(enter.object())->OnOpenComplete( | 
| -        result, handle, length, | 
| -        IPC::PlatformFileForTransitToPlatformFile(socket_handle)); | 
| +        result, handle.shmem(), media::PacketSizeInBytes(handle.size()), | 
| +        IPC::PlatformFileForTransitToPlatformFile(socket_handle.descriptor())); | 
| } | 
| } | 
|  | 
| @@ -316,15 +323,28 @@ void PPB_AudioInput_Proxy::EnumerateDevicesACKInHost( | 
|  | 
| void PPB_AudioInput_Proxy::OpenACKInHost(int32_t result, | 
| const HostResource& audio_input) { | 
| -  IPC::PlatformFileForTransit socket_handle = | 
| -      IPC::InvalidPlatformFileForTransit(); | 
| -  base::SharedMemoryHandle shared_memory = IPC::InvalidPlatformFileForTransit(); | 
| -  uint32_t shared_memory_length = 0; | 
| +  ppapi::proxy::SerializedHandle socket_handle( | 
| +      ppapi::proxy::SerializedHandle::SOCKET); | 
| +  ppapi::proxy::SerializedHandle shared_memory( | 
| +      ppapi::proxy::SerializedHandle::SHARED_MEMORY); | 
|  | 
| if (result == PP_OK) { | 
| -    result = GetAudioInputConnectedHandles(audio_input, &socket_handle, | 
| -                                           &shared_memory, | 
| -                                           &shared_memory_length); | 
| +    IPC::PlatformFileForTransit temp_socket; | 
| +    base::SharedMemoryHandle temp_shmem; | 
| +    uint32_t audio_buffer_size; | 
| +    result = GetAudioInputConnectedHandles(audio_input, &temp_socket, | 
| +                                           &temp_shmem, &audio_buffer_size); | 
| +    if (result == PP_OK) { | 
| +      socket_handle.set_socket(temp_socket); | 
| +      // Note that we must call TotalSharedMemorySizeInBytes because | 
| +      // Audio allocates extra space in shared memory for book-keeping, so the | 
| +      // actual size of the shared memory buffer is larger than | 
| +      // audio_buffer_length. When sending to NaCl, NaClIPCAdapter expects this | 
| +      // size to match the size of the full shared memory buffer. | 
| +      shared_memory.set_shmem( | 
| +          temp_shmem, | 
| +          media::TotalSharedMemorySizeInBytes(audio_buffer_size)); | 
| +    } | 
| } | 
|  | 
| // Send all the values, even on error. This simplifies some of our cleanup | 
| @@ -334,7 +354,7 @@ void PPB_AudioInput_Proxy::OpenACKInHost(int32_t result, | 
| // (in OnMsgOpenACK), even in the failure case. | 
| dispatcher()->Send(new PpapiMsg_PPBAudioInput_OpenACK( | 
| API_ID_PPB_AUDIO_INPUT_DEV, audio_input, result, socket_handle, | 
| -      shared_memory, shared_memory_length)); | 
| +      shared_memory)); | 
| } | 
|  | 
| int32_t PPB_AudioInput_Proxy::GetAudioInputConnectedHandles( | 
|  |