|  | /* | 
|  | *  Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. | 
|  | * | 
|  | *  Use of this source code is governed by a BSD-style license | 
|  | *  that can be found in the LICENSE file in the root of the source | 
|  | *  tree. An additional intellectual property rights grant can be found | 
|  | *  in the file PATENTS.  All contributing project authors may | 
|  | *  be found in the AUTHORS file in the root of the source tree. | 
|  | */ | 
|  |  | 
|  | #ifndef WEBRTC_MODULES_AUDIO_DEVICE_ANDROID_LOW_LATENCY_EVENT_H_ | 
|  | #define WEBRTC_MODULES_AUDIO_DEVICE_ANDROID_LOW_LATENCY_EVENT_H_ | 
|  |  | 
|  | #include <errno.h> | 
|  | #include <limits.h> | 
|  | #include <fcntl.h> | 
|  | #include <stdio.h> | 
|  | #include <sys/ioctl.h> | 
|  | #include <sys/socket.h> | 
|  | #include <sys/types.h> | 
|  |  | 
|  | namespace webrtc { | 
|  |  | 
|  | // Implementation of event for single waiter, single signal threads. Event | 
|  | // is sticky. | 
|  | class LowLatencyEvent { | 
|  | public: | 
|  | LowLatencyEvent(); | 
|  | ~LowLatencyEvent(); | 
|  |  | 
|  | // Readies the event. Must be called before signaling or waiting for event. | 
|  | // Returns true on success. | 
|  | bool Start(); | 
|  | // Shuts down the event and releases threads calling WaitOnEvent. Once | 
|  | // stopped SignalEvent and WaitOnEvent will have no effect. Start can be | 
|  | // called to re-enable the event. | 
|  | // Returns true on success. | 
|  | bool Stop(); | 
|  |  | 
|  | // Releases thread calling WaitOnEvent in a sticky fashion. | 
|  | void SignalEvent(int event_id, int event_msg); | 
|  | // Waits until SignalEvent or Stop is called. | 
|  | void WaitOnEvent(int* event_id, int* event_msg); | 
|  |  | 
|  | private: | 
|  | typedef int Handle; | 
|  | static const Handle kInvalidHandle; | 
|  | static const int kReadHandle; | 
|  | static const int kWriteHandle; | 
|  |  | 
|  | // Closes the handle. Returns true on success. | 
|  | static bool Close(Handle* handle); | 
|  |  | 
|  | // SignalEvent and WaitOnEvent are actually read/write to file descriptors. | 
|  | // Write is signal. | 
|  | void WriteFd(int message_id, int message); | 
|  | // Read is wait. | 
|  | void ReadFd(int* message_id, int* message); | 
|  |  | 
|  | Handle handles_[2]; | 
|  | }; | 
|  |  | 
|  | }  // namespace webrtc | 
|  |  | 
|  | #endif  // WEBRTC_MODULES_AUDIO_DEVICE_ANDROID_LOW_LATENCY_EVENT_H_ |