summaryrefslogtreecommitdiffstats
path: root/chrome/browser/chromeos/pulse_audio_mixer.h
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/chromeos/pulse_audio_mixer.h')
-rw-r--r--chrome/browser/chromeos/pulse_audio_mixer.h125
1 files changed, 125 insertions, 0 deletions
diff --git a/chrome/browser/chromeos/pulse_audio_mixer.h b/chrome/browser/chromeos/pulse_audio_mixer.h
new file mode 100644
index 0000000..223fe33
--- /dev/null
+++ b/chrome/browser/chromeos/pulse_audio_mixer.h
@@ -0,0 +1,125 @@
+// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_CHROMEOS_PULSE_AUDIO_MIXER_H_
+#define CHROME_BROWSER_CHROMEOS_PULSE_AUDIO_MIXER_H_
+
+#include "base/basictypes.h"
+#include "base/callback.h"
+#include "base/scoped_ptr.h"
+#include "base/thread.h"
+
+struct pa_context;
+struct pa_cvolume;
+struct pa_threaded_mainloop;
+struct pa_operation;
+struct pa_sink_info;
+
+namespace chromeos {
+
+class PulseAudioMixer {
+ public:
+ PulseAudioMixer();
+ ~PulseAudioMixer();
+
+ // Non-blocking, connect to PulseAudio and find a default device, and call
+ // callback when complete with success code.
+ typedef Callback1<bool>::Type InitDoneCallback;
+ bool Init(InitDoneCallback* callback);
+
+ // Blocking call. Returns a default of -inf on error.
+ double GetVolumeDb() const;
+
+ // Non-blocking, volume sent in as first param to callback
+ typedef Callback2<double, void*>::Type GetVolumeCallback;
+ void GetVolumeDbAsync(GetVolumeCallback* callback, void* user);
+
+ // Non-blocking call.
+ void SetVolumeDb(double vol_db);
+
+ // Gets the mute state of the default device (true == mute). Blocking call.
+ // Returns a default of false on error.
+ bool IsMute() const;
+
+ // Non-Blocking call.
+ void SetMute(bool mute);
+
+ // Call any time to see if we have a valid working connection to PulseAudio.
+ // Non-blocking call.
+ bool IsValid() const;
+
+ private:
+ struct AudioInfo;
+
+ enum State {
+ UNINITIALIZED = 0,
+ INITIALIZING,
+ READY,
+ SHUTTING_DOWN
+ };
+
+ // These are the tasks to be run in the background on the worker thread.
+ void DoInit(InitDoneCallback* callback);
+ void DoGetVolume(GetVolumeCallback* callback, void* user);
+
+ static void ConnectToPulseCallbackThunk(pa_context* c, void* userdata);
+ void OnConnectToPulseCallback(pa_context* c, bool* connect_done);
+
+ // This goes through sequence of connecting to the default PulseAudio server.
+ // We will block until we either have a valid connection or something failed.
+ // If a connection is lost for some reason, delete and recreate the object.
+ bool PulseAudioInit();
+
+ // PulseAudioFree. Disconnect from server.
+ void PulseAudioFree();
+
+ // Check if the PA system is ready for communication, as well as if a default
+ // device is available to talk to. This can return false if we lose the
+ // connection, even after an original successful init.
+ bool PulseAudioValid() const;
+
+ // Iterates the PA mainloop and only returns once an operation has completed
+ // (successfully or unsuccessfully). This call only blocks the worker thread.
+ void CompleteOperationAndUnlock(pa_operation* pa_op) const;
+
+ // For now, this just gets the first device returned from the enumeration
+ // request. This will be the 'default' or 'master' device that all further
+ // actions are taken on. Blocking call.
+ void GetDefaultPlaybackDevice();
+ static void EnumerateDevicesCallback(pa_context* unused,
+ const pa_sink_info* sink_info,
+ int eol,
+ void* userdata);
+ void OnEnumerateDevices(const pa_sink_info* sink_info, int eol);
+
+ // Get the info we're interested in from the default device. Currently this
+ // is an array of volumes, and the mute state. Blocking call.
+ void GetAudioInfo(AudioInfo* info) const;
+ static void GetAudioInfoCallback(pa_context* unused,
+ const pa_sink_info* sink_info,
+ int eol,
+ void* userdata);
+
+ // The PulseAudio index of the main device being used.
+ mutable int device_id_;
+
+ // Set to the number of channels on the main device.
+ int last_channels_;
+ State mixer_state_;
+
+ // Cached contexts for use in PulseAudio calls.
+ pa_context* pa_context_;
+ pa_threaded_mainloop* pa_mainloop_;
+
+ scoped_ptr<base::Thread> thread_;
+
+ DISALLOW_COPY_AND_ASSIGN(PulseAudioMixer);
+};
+
+} // namespace chromeos
+
+DISABLE_RUNNABLE_METHOD_REFCOUNT(chromeos::PulseAudioMixer);
+
+#endif // CHROME_BROWSER_CHROMEOS_PULSE_AUDIO_MIXER_H_
+