1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chrome/browser/extensions/api/audio/audio_service.h"
6
7#include "base/callback.h"
8#include "base/memory/weak_ptr.h"
9#include "base/observer_list.h"
10#include "base/strings/string_number_conversions.h"
11#include "base/threading/thread_checker.h"
12#include "content/public/browser/browser_thread.h"
13
14using content::BrowserThread;
15
16namespace extensions {
17
18using api::audio::OutputDeviceInfo;
19using api::audio::InputDeviceInfo;
20
21class AudioServiceImpl : public AudioService {
22 public:
23  AudioServiceImpl();
24  virtual ~AudioServiceImpl();
25
26 private:
27  // Called by listeners to this service to add/remove themselves as observers.
28  virtual void AddObserver(AudioService::Observer* observer) OVERRIDE;
29  virtual void RemoveObserver(AudioService::Observer* observer) OVERRIDE;
30
31  // Start to query audio device information.
32  virtual void StartGetInfo(const GetInfoCallback& callback) OVERRIDE;
33  virtual void SetActiveDevices(const DeviceIdList& device_list) OVERRIDE;
34  virtual bool SetDeviceProperties(const std::string& device_id,
35                                   bool muted,
36                                   int volume,
37                                   int gain) OVERRIDE;
38
39  // List of observers.
40  ObserverList<AudioService::Observer> observer_list_;
41
42  base::ThreadChecker thread_checker_;
43
44  // Note: This should remain the last member so it'll be destroyed and
45  // invalidate the weak pointers before any other members are destroyed.
46  base::WeakPtrFactory<AudioServiceImpl> weak_ptr_factory_;
47
48  DISALLOW_COPY_AND_ASSIGN(AudioServiceImpl);
49};
50
51AudioServiceImpl::AudioServiceImpl() : weak_ptr_factory_(this) {
52  DCHECK(thread_checker_.CalledOnValidThread());
53}
54
55AudioServiceImpl::~AudioServiceImpl() {
56  DCHECK(thread_checker_.CalledOnValidThread());
57}
58
59void AudioServiceImpl::AddObserver(AudioService::Observer* observer) {
60  DCHECK(thread_checker_.CalledOnValidThread());
61  observer_list_.AddObserver(observer);
62}
63
64void AudioServiceImpl::RemoveObserver(AudioService::Observer* observer) {
65  DCHECK(thread_checker_.CalledOnValidThread());
66  observer_list_.RemoveObserver(observer);
67}
68
69void AudioServiceImpl::StartGetInfo(const GetInfoCallback& callback) {
70  DCHECK(thread_checker_.CalledOnValidThread());
71  if (!callback.is_null())
72    callback.Run(OutputInfo(), InputInfo(), false);
73}
74
75void AudioServiceImpl::SetActiveDevices(const DeviceIdList& device_list) {
76  DCHECK(thread_checker_.CalledOnValidThread());
77}
78
79bool AudioServiceImpl::SetDeviceProperties(const std::string& device_id,
80                                           bool muted,
81                                           int volume,
82                                           int gain) {
83  DCHECK(thread_checker_.CalledOnValidThread());
84  return false;
85}
86
87AudioService* AudioService::CreateInstance() {
88  return new AudioServiceImpl;
89}
90
91}  // namespace extensions
92