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

#ifndef CONTENT_BROWSER_SPEECH_SPEECH_RECOGNIZER_H_
#define CONTENT_BROWSER_SPEECH_SPEECH_RECOGNIZER_H_

#include "base/check.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/ref_counted.h"
#include "content/common/content_export.h"
#include "media/mojo/mojom/speech_recognition_recognition_context.h"

namespace content {

class SpeechRecognitionEventListener;

// Handles speech recognition for a session (identified by |session_id|).
class CONTENT_EXPORT SpeechRecognizer
    : public base::RefCountedThreadSafe<SpeechRecognizer> {
 public:
  SpeechRecognizer(SpeechRecognitionEventListener* listener, int session_id);

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

  virtual void StartRecognition(const std::string& device_id) = 0;
  virtual void UpdateRecognitionContext(
      const media::SpeechRecognitionRecognitionContext&
          recognition_context) = 0;
  virtual void AbortRecognition() = 0;
  virtual void StopAudioCapture() = 0;
  virtual bool IsActive() const = 0;
  virtual bool IsCapturingAudio() const = 0;

 protected:
  friend class base::RefCountedThreadSafe<SpeechRecognizer>;

  virtual ~SpeechRecognizer() {}
  SpeechRecognitionEventListener* listener() const { return listener_; }
  int session_id() const { return session_id_; }

 private:
  raw_ptr<SpeechRecognitionEventListener> listener_;
  int session_id_;
};

}  // namespace content

#endif  // CONTENT_BROWSER_SPEECH_SPEECH_RECOGNIZER_H_
