Roc Toolkit internal modules
Roc Toolkit: real-time audio streaming
sox_sink.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2015 Roc Streaming authors
3  *
4  * This Source Code Form is subject to the terms of the Mozilla Public
5  * License, v. 2.0. If a copy of the MPL was not distributed with this
6  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
7  */
8 
9 //! @file roc_sndio/target_sox/roc_sndio/sox_sink.h
10 //! @brief SoX sink.
11 
12 #ifndef ROC_SNDIO_SOX_SINK_H_
13 #define ROC_SNDIO_SOX_SINK_H_
14 
15 #include <sox.h>
16 
17 #include "roc_audio/sample_spec.h"
18 #include "roc_core/array.h"
19 #include "roc_core/iarena.h"
20 #include "roc_core/noncopyable.h"
21 #include "roc_core/stddefs.h"
22 #include "roc_packet/units.h"
23 #include "roc_sndio/config.h"
24 #include "roc_sndio/isink.h"
25 
26 namespace roc {
27 namespace sndio {
28 
29 //! SoX sink.
30 //! @remarks
31 //! Writes samples to output file or device.
32 //! Supports multiple drivers for different file types and audio systems.
33 class SoxSink : public ISink, public core::NonCopyable<> {
34 public:
35  //! Initialize.
36  SoxSink(core::IArena& arena, const Config& config);
37 
38  virtual ~SoxSink();
39 
40  //! Check if the object was successfully constructed.
41  bool is_valid() const;
42 
43  //! Open output file or device.
44  //!
45  //! @b Parameters
46  //! - @p driver is output driver name;
47  //! - @p path is output file or device name, "-" for stdout.
48  //!
49  //! @remarks
50  //! If @p driver or @p path are NULL, defaults are used.
51  bool open(const char* driver, const char* path);
52 
53  //! Get device type.
54  virtual DeviceType type() const;
55 
56  //! Get device state.
57  virtual DeviceState state() const;
58 
59  //! Pause reading.
60  virtual void pause();
61 
62  //! Resume paused reading.
63  virtual bool resume();
64 
65  //! Restart reading from the beginning.
66  virtual bool restart();
67 
68  //! Get sample specification of the sink.
69  virtual audio::SampleSpec sample_spec() const;
70 
71  //! Get latency of the sink.
72  virtual core::nanoseconds_t latency() const;
73 
74  //! Check if the sink supports latency reports.
75  virtual bool has_latency() const;
76 
77  //! Check if the sink has own clock.
78  virtual bool has_clock() const;
79 
80  //! Write audio frame.
81  virtual void write(audio::Frame& frame);
82 
83 private:
84  bool setup_buffer_();
85  bool open_(const char* driver, const char* path);
86  void write_(const sox_sample_t* samples, size_t n_samples);
87  void close_();
88 
89  sox_format_t* output_;
90  sox_signalinfo_t out_signal_;
91 
93  size_t buffer_size_;
94  core::nanoseconds_t frame_length_;
95  audio::SampleSpec sample_spec_;
96 
97  bool is_file_;
98  bool valid_;
99 };
100 
101 } // namespace sndio
102 } // namespace roc
103 
104 #endif // ROC_SNDIO_SOX_SINK_H_
Dynamic array.
Audio frame.
Definition: frame.h:25
Sample specification. Describes sample rate and channels.
Definition: sample_spec.h:26
Memory arena interface.
Definition: iarena.h:23
Base class for non-copyable objects.
Definition: noncopyable.h:23
Sink interface.
Definition: isink.h:22
virtual bool resume()
Resume paused reading.
virtual audio::SampleSpec sample_spec() const
Get sample specification of the sink.
bool is_valid() const
Check if the object was successfully constructed.
virtual void write(audio::Frame &frame)
Write audio frame.
virtual DeviceState state() const
Get device state.
SoxSink(core::IArena &arena, const Config &config)
Initialize.
bool open(const char *driver, const char *path)
Open output file or device.
virtual bool has_latency() const
Check if the sink supports latency reports.
virtual void pause()
Pause reading.
virtual bool restart()
Restart reading from the beginning.
virtual DeviceType type() const
Get device type.
virtual bool has_clock() const
Check if the sink has own clock.
virtual core::nanoseconds_t latency() const
Get latency of the sink.
Memory arena interface.
Sink interface.
int64_t nanoseconds_t
Nanoseconds.
Definition: time.h:58
DeviceType
Device type.
Definition: device_type.h:19
DeviceState
Device state.
Definition: device_state.h:19
Root namespace.
Non-copyable object.
Sink and source config.
Sample specifications.
Commonly used types and functions.
Sink and source config.
Definition: config.h:29
Various units used in packets.