/*
 *  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.
 */

// This utility will portably force the volume of the default microphone to max.

#include <stdio.h>

#include "modules/audio_device/include/audio_device.h"

using webrtc::AudioDeviceModule;

#if defined(_WIN32)
#define DEFAULT_INPUT_DEVICE (AudioDeviceModule::kDefaultCommunicationDevice)
#else
#define DEFAULT_INPUT_DEVICE (0)
#endif

int main(int /*argc*/, char** /*argv*/) {
  // Create and initialize the ADM.
  rtc::scoped_refptr<AudioDeviceModule> adm(
      AudioDeviceModule::Create(AudioDeviceModule::kPlatformDefaultAudio));
  if (!adm.get()) {
    fprintf(stderr, "Failed to create Audio Device Module.\n");
    return 1;
  }
  if (adm->Init() != 0) {
    fprintf(stderr, "Failed to initialize Audio Device Module.\n");
    return 1;
  }
  if (adm->SetRecordingDevice(DEFAULT_INPUT_DEVICE) != 0) {
    fprintf(stderr, "Failed to set the default input device.\n");
    return 1;
  }
  if (adm->InitMicrophone() != 0) {
    fprintf(stderr, "Failed to to initialize the microphone.\n");
    return 1;
  }

  // Set mic volume to max.
  uint32_t max_vol = 0;
  if (adm->MaxMicrophoneVolume(&max_vol) != 0) {
    fprintf(stderr, "Failed to get max volume.\n");
    return 1;
  }
  if (adm->SetMicrophoneVolume(max_vol) != 0) {
    fprintf(stderr, "Failed to set mic volume.\n");
    return 1;
  }

  return 0;
}
