audio_manager_unittest.cc revision 58537e28ecd584eab876aee8be7156509866d23a
158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// found in the LICENSE file.
458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/logging.h"
658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/memory/scoped_ptr.h"
758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "media/audio/audio_manager.h"
858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#if defined(OS_LINUX)
1158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "media/audio/linux/audio_manager_linux.h"
1258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif  // defined(OS_LINUX)
1358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#if defined(OS_WIN)
1558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "media/audio/win/audio_manager_win.h"
1658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif  // defined(OS_WIN)
1758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#if defined(USE_PULSEAUDIO)
1958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "media/audio/pulse/audio_manager_pulse.h"
2058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif  // defined(USE_PULSEAUDIO)
2158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
2258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)namespace media {
2358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
2458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void GetAudioOutputDeviceNamesImpl(AudioManager* audio_manager) {
2558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  AudioDeviceNames device_names;
2658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  audio_manager->GetAudioOutputDeviceNames(&device_names);
2758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
2858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  VLOG(2) << "Got " << device_names.size() << " audio output devices.";
2958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  for (AudioDeviceNames::iterator it = device_names.begin();
3058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)       it != device_names.end();
3158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)       ++it) {
3258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_FALSE(it->unique_id.empty());
3358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_FALSE(it->device_name.empty());
3458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    VLOG(2) << "Device ID(" << it->unique_id << "), label: " << it->device_name;
3558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
3658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
3758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
3858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// So that tests herein can be friends of AudioManagerWin.
3958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)//
4058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// TODO(joi): Make this go away by unifying audio_manager_unittest.cc
4158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// and audio_input_device_unittest.cc
4258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class AudioManagerTest : public ::testing::Test {
4358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) public:
4458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  bool SetupForSecondTest(AudioManager* amw) {
4558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#if defined(OS_WIN)
4658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    AudioManagerWin* audio_manager_win = static_cast<AudioManagerWin*>(amw);
4758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    if (audio_manager_win->enumeration_type() ==
4858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        AudioManagerWin::kWaveEnumeration) {
4958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      // This will be true only if running on Windows XP.
5058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      VLOG(2) << "AudioManagerWin on WinXP; nothing more to test.";
5158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    } else {
5258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      VLOG(2) << "Testing AudioManagerWin in fallback WinXP mode.";
5358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      audio_manager_win->SetEnumerationType(AudioManagerWin::kWaveEnumeration);
5458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      return true;
5558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
5658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif  // defined(OS_WIN)
5758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return false;
5858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
5958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)};
6058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
6158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(AudioManagerTest, GetAudioOutputDeviceNames) {
6258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // On Linux, we may be able to test both the Alsa and Pulseaudio
6358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // versions of the audio manager.
6458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#if defined(USE_PULSEAUDIO)
6558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  {
6658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    VLOG(2) << "Testing AudioManagerPulse.";
6758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    scoped_ptr<AudioManager> pulse_audio_manager(AudioManagerPulse::Create());
6858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    if (pulse_audio_manager.get())
6958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      GetAudioOutputDeviceNamesImpl(pulse_audio_manager.get());
7058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    else
7158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      LOG(WARNING) << "No pulseaudio on this system.";
7258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
7358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif  // defined(USE_PULSEAUDIO)
7458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#if defined(USE_ALSA)
7558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  {
7658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    VLOG(2) << "Testing AudioManagerLinux.";
7758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    scoped_ptr<AudioManager> alsa_audio_manager(new AudioManagerLinux());
7858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    GetAudioOutputDeviceNamesImpl(alsa_audio_manager.get());
7958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
8058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif  // defined(USE_ALSA)
8158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
8258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#if defined(OS_MACOSX)
8358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  VLOG(2) << "Testing platform-default AudioManager.";
8458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_ptr<AudioManager> audio_manager(AudioManager::Create());
8558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  GetAudioOutputDeviceNamesImpl(audio_manager.get());
8658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif  // defined(OS_MACOSX)
8758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
8858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#if defined(OS_WIN)
8958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  {
9058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // TODO(joi): Unify the tests in audio_input_device_unittest.cc
9158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // with the tests in this file, and reuse the Windows-specific
9258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // bits from that file.
9358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    VLOG(2) << "Testing AudioManagerWin in its default mode.";
9458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    scoped_ptr<AudioManager> audio_manager_win(AudioManager::Create());
9558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    GetAudioOutputDeviceNamesImpl(audio_manager_win.get());
9658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
9758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    if (SetupForSecondTest(audio_manager_win.get())) {
9858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      GetAudioOutputDeviceNamesImpl(audio_manager_win.get());
9958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
10058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
10158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif  // defined(OS_WIN)
10258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
10358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
10458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(AudioManagerTest, GetDefaultOutputStreamParameters) {
10558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#if defined(OS_WIN) || defined(OS_MACOSX)
10658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_ptr<AudioManager> audio_manager(AudioManager::Create());
10758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_TRUE(audio_manager);
10858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (!audio_manager->HasAudioOutputDevices())
10958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return;
11058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
11158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  AudioParameters params = audio_manager->GetDefaultOutputStreamParameters();
11258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_TRUE(params.IsValid());
11358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif  // defined(OS_WIN) || defined(OS_MACOSX)
11458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
11558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
11658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(AudioManagerTest, GetAssociatedOutputDeviceID) {
11758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#if defined(OS_WIN) || defined(OS_MACOSX)
11858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_ptr<AudioManager> audio_manager(AudioManager::Create());
11958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_TRUE(audio_manager);
12058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (!audio_manager->HasAudioOutputDevices() ||
12158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      !audio_manager->HasAudioInputDevices()) {
12258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return;
12358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
12458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
12558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  AudioDeviceNames device_names;
12658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  audio_manager->GetAudioInputDeviceNames(&device_names);
12758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  bool found_an_associated_device = false;
12858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  for (AudioDeviceNames::iterator it = device_names.begin();
12958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)       it != device_names.end();
13058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)       ++it) {
13158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_FALSE(it->unique_id.empty());
13258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_FALSE(it->device_name.empty());
13358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    std::string output_device_id(
13458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        audio_manager->GetAssociatedOutputDeviceID(it->unique_id));
13558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    if (!output_device_id.empty()) {
13658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      VLOG(2) << it->unique_id << " matches with " << output_device_id;
13758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      found_an_associated_device = true;
13858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
13958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
14058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
14158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_TRUE(found_an_associated_device);
14258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif  // defined(OS_WIN) || defined(OS_MACOSX)
14358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
14458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
14558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}  // namespace media
146