chromium/chromecast/media/audio/audio_log.h

// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CHROMECAST_MEDIA_AUDIO_AUDIO_LOG_H_
#define CHROMECAST_MEDIA_AUDIO_AUDIO_LOG_H_

#include <ostream>

#include "base/logging.h"

namespace logging {

#define AUDIO_LOG_STREAM(severity) \
  COMPACT_GOOGLE_LOG_EX_##severity(AudioLogMessage).stream()

#define AUDIO_LOG(severity) \
  LAZY_STREAM(AUDIO_LOG_STREAM(severity), LOG_IS_ON(severity))

#define AUDIO_LOG_IF(severity, condition) \
  LAZY_STREAM(AUDIO_LOG_STREAM(severity), LOG_IS_ON(severity) && (condition))

class AudioLogMessage {
 public:
  class BufferManager;
  static BufferManager* GetBufferManager();

  AudioLogMessage(const char* file, int line, LogSeverity severity);
  ~AudioLogMessage();

  AudioLogMessage(const AudioLogMessage&) = delete;
  AudioLogMessage& operator=(const AudioLogMessage&) = delete;

  std::ostream& stream() { return stream_; }

  // Cancels any log output for this message.
  void Cancel();

 private:
  class StreamBuf;

  StreamBuf* buffer_;
  std::ostream stream_;
};

// Should be called on a lower-priority thread. Actual output of log messages
// will be done on this thread. Note that any use of AudioLogMessage prior to
// InitializeAudioLog() will not produce any output.
void InitializeAudioLog();

// Initializes audio log with an existing buffer manager. May be called from any
// thread (the thread that originally called InitializeAudioLog() to create the
// buffer manager will be used for log output). Useful for logging in shlibs.
void InitializeShlibAudioLog(AudioLogMessage::BufferManager* manager);

}  // namespace logging

#endif  // CHROMECAST_MEDIA_AUDIO_AUDIO_LOG_H_