blob: 645f0bdc0c809cf1d39fdf312614f2590d5af892 [file] [log] [blame]
// Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// An interface representing a real-time audio output system on a particular
// platform.
#ifndef SPEECH_CLIENT_SYNTHESIS_SERVICE_AUDIO_OUTPUT_H_
#define SPEECH_CLIENT_SYNTHESIS_SERVICE_AUDIO_OUTPUT_H_
#include <stdlib.h>
namespace speech_synthesis {
class Threading;
// This is an interface defining the method that fills an audio buffer
// for real-time audio output. Typically the TtsService implements this
// method for AudioOutput, so that the service has all of the logic for
// computing the samples to be computed, but AudioOutput has all of the logic
// for dealing with the platform-specific audio hardware abstraction.
class AudioProvider {
public:
virtual ~AudioProvider() { }
// This method must return quickly and not block. It must always
// fill all of the samples, with silence padding as needed.
// Returns false if audio should completely stop.
virtual bool FillAudioBuffer(int16_t* samples, int size) = 0;
};
// This is the abstract definition of a class that does real-time audio
// output. You must provide an implementation of an AudioProvider that
// provides the actual samples to output on demand (or silence, if there
// are not enough samples available immediately). Subclasses of AudioOutput
// implement these methods using various platform-specific methods.
class AudioOutput {
protected:
AudioOutput() { }
public:
// Static factory method, creates whatever AudioOutput subclass
// has been linked in.
static AudioOutput* Create(Threading *threading);
virtual ~AudioOutput() {}
// Initialize audio output, getting audio samples from the given provider.
// Returns true on success. Safe to call more than once.
virtual bool Init(AudioProvider *provider) = 0;
virtual void StartAudio() = 0;
virtual void StopAudio() = 0;
virtual int GetSampleRate() = 0;
virtual int GetChannelCount() = 0;
// The typical number of samples that will be requested at once.
// The TTS system may want to generate audio in increments of this
// many samples, but it's just a hint.
virtual int GetChunkSize() = 0;
// The number of samples needed to completely fill the audio buffers.
// The provider must be able to quickly produce at least this many
// samples in order to avoid underflow.
virtual int GetTotalBufferSize() = 0;
};
} // namespace speech_synthesis
#endif // SPEECH_CLIENT_SYNTHESIS_SERVICE_AUDIO_OUTPUT_H_