// Copyright (c) 2012 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.

#include "media/audio/audio_manager.h"

#include "base/bind.h"
#include "base/bind_helpers.h"
#include "base/lazy_instance.h"
#include "base/logging.h"
#include "base/message_loop/message_loop.h"
#include "media/audio/fake_audio_log_factory.h"

namespace media {
namespace {
AudioManager* g_last_created = NULL;
static base::LazyInstance<FakeAudioLogFactory>::Leaky g_fake_log_factory =
    LAZY_INSTANCE_INITIALIZER;
}

// Forward declaration of the platform specific AudioManager factory function.
AudioManager* CreateAudioManager(AudioLogFactory* audio_log_factory);

AudioManager::AudioManager() {}

AudioManager::~AudioManager() {
  CHECK(!g_last_created || g_last_created == this);
  g_last_created = NULL;
}

// static
AudioManager* AudioManager::Create(AudioLogFactory* audio_log_factory) {
  CHECK(!g_last_created);
  g_last_created = CreateAudioManager(audio_log_factory);
  return g_last_created;
}

// static
AudioManager* AudioManager::CreateForTesting() {
  return Create(g_fake_log_factory.Pointer());
}

// static
AudioManager* AudioManager::Get() {
  return g_last_created;
}

}  // namespace media
