summaryrefslogtreecommitdiff
path: root/www/chromium/files/sndio_input.h
diff options
context:
space:
mode:
authorCarlos J. Puga Medina <cpm@FreeBSD.org>2017-06-27 21:56:39 +0000
committerCarlos J. Puga Medina <cpm@FreeBSD.org>2017-06-27 21:56:39 +0000
commitca28e15b282bd93075ea9b228a1b6b8cd19a5328 (patch)
tree4a38cd12f40aa80ee58c2c01dbe24ab797d648b4 /www/chromium/files/sndio_input.h
parentwww/iridium: add SNDIO option (diff)
www/chromium: add SNDIO option
PR: 220230 Submitted by: tobik
Notes
Notes: svn path=/head/; revision=444520
Diffstat (limited to 'www/chromium/files/sndio_input.h')
-rw-r--r--www/chromium/files/sndio_input.h108
1 files changed, 108 insertions, 0 deletions
diff --git a/www/chromium/files/sndio_input.h b/www/chromium/files/sndio_input.h
new file mode 100644
index 000000000000..b354f66fd55a
--- /dev/null
+++ b/www/chromium/files/sndio_input.h
@@ -0,0 +1,108 @@
+// Copyright 2013 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.
+
+#ifndef MEDIA_AUDIO_SNDIO_SNDIO_INPUT_H_
+#define MEDIA_AUDIO_SNDIO_SNDIO_INPUT_H_
+
+#include <stdint.h>
+#include <string>
+#include <sndio.h>
+
+#include "base/compiler_specific.h"
+#include "base/macros.h"
+#include "base/memory/weak_ptr.h"
+#include "base/time/time.h"
+#include "media/audio/agc_audio_stream.h"
+#include "media/audio/audio_io.h"
+#include "media/audio/audio_device_description.h"
+#include "media/base/audio_parameters.h"
+
+namespace media {
+
+class AudioManagerBase;
+
+// call-backs invoked from C libraries, thus requiring C linkage
+extern "C" {
+ // Invoked (on the real-time thread) at each sound card clock tick
+ void sndio_in_onmove(void *arg, int delta);
+ // Invoked (on the real-time thread) whenever the volume changes
+ void sndio_in_onvol(void *arg, unsigned int vol);
+ // Real-time thread entry point
+ void *sndio_in_threadstart(void *arg);
+}
+
+// Provides an input stream for audio capture based on the SNDIO PCM interface.
+// This object is not thread safe and all methods should be invoked in the
+// thread that created the object.
+class SndioAudioInputStream : public AgcAudioStream<AudioInputStream> {
+ public:
+ // Pass this to the constructor if you want to attempt auto-selection
+ // of the audio recording device.
+ static const char kAutoSelectDevice[];
+
+ // Create a PCM Output stream for the SNDIO device identified by
+ // |device_name|. If unsure of what to use for |device_name|, use
+ // |kAutoSelectDevice|.
+ SndioAudioInputStream(AudioManagerBase* audio_manager,
+ const std::string& device_name,
+ const AudioParameters& params);
+
+ ~SndioAudioInputStream() override;
+
+ // Implementation of AudioInputStream.
+ bool Open() override;
+ void Start(AudioInputCallback* callback) override;
+ void Stop() override;
+ void Close() override;
+ double GetMaxVolume() override;
+ void SetVolume(double volume) override;
+ double GetVolume() override;
+ bool IsMuted() override;
+
+ // C-linkage call-backs are friends to access private data
+ friend void sndio_in_onmove(void *arg, int delta);
+ friend void sndio_in_onvol(void *arg, unsigned int vol);
+ friend void *sndio_in_threadstart(void *arg);
+
+ private:
+ // Logs the error and invokes any registered callbacks.
+ void HandleError(const char* method, int error);
+
+ // Reads one or more buffers of audio from the device, passes on to the
+ // registered callback and schedules the next read.
+ void ReadAudio();
+
+ // Recovers from any device errors if possible.
+ bool Recover(int error);
+
+ // Non-refcounted pointer back to the audio manager.
+ // The AudioManager indirectly holds on to stream objects, so we don't
+ // want circular references. Additionally, stream objects live on the audio
+ // thread, which is owned by the audio manager and we don't want to addref
+ // the manager from that thread.
+ AudioManagerBase* audio_manager_;
+ std::string device_name_;
+ AudioParameters params_;
+ int bytes_per_buffer_;
+ base::TimeDelta buffer_duration_; // Length of each recorded buffer.
+ AudioInputCallback* callback_; // Valid during a recording session.
+ base::TimeTicks next_read_time_; // Scheduled time for next read callback.
+ struct sio_hdl* device_handle_; // Handle to the SNDIO PCM recording device.
+ std::unique_ptr<uint8_t[]> audio_buffer_; // Buffer used for reading audio data.
+ bool read_callback_behind_schedule_;
+ std::unique_ptr<AudioBus> audio_bus_;
+
+ int hw_delay_;
+ int sndio_rec_bufsize_;
+ int sndio_rec_bufsz_;
+
+ // High priority thread running RealTimeThread()
+ pthread_t thread_;
+
+ DISALLOW_COPY_AND_ASSIGN(SndioAudioInputStream);
+};
+
+} // namespace media
+
+#endif // MEDIA_AUDIO_SNDIO_SNDIO_INPUT_H_