Ardour
9.2-192-g63870a7930
cmdpipe_writer.h
Go to the documentation of this file.
1
#ifndef AUDIOGRAPHER_CMDPIPE_WRITER_H
2
#define AUDIOGRAPHER_CMDPIPE_WRITER_H
3
4
#include <string>
5
6
#include <glib.h>
7
8
#include "
audiographer/flag_debuggable.h
"
9
#include "
audiographer/sink.h
"
10
#include "
audiographer/types.h
"
11
12
#include "
pbd/gstdio_compat.h
"
13
#include "
pbd/signals.h
"
14
15
#include "
ardour/system_exec.h
"
16
#include "
ardour/export_failed.h
"
17
18
#if defined(COMPILER_MSVC) && defined(WAF_BUILD)
19
#include <
io.h
>
//for write, close
20
#endif
21
22
namespace
AudioGrapher
23
{
24
28
template
<
typename
T = DefaultSampleType>
29
class
CmdPipeWriter
30
:
public
Sink
<T>
31
,
public
Throwing
<>
32
,
public
FlagDebuggable
<>
33
{
34
public
:
35
CmdPipeWriter
(
ARDOUR::SystemExec
* proc, std::string
const
& path,
int
tmp_fd = -1, gchar* tmp_file = 0)
36
:
samples_written
(0)
37
,
_proc
(proc)
38
,
_path
(path)
39
,
_tmp_fd
(tmp_fd)
40
,
_tmp_file
(tmp_file)
41
{
42
add_supported_flag
(
ProcessContext<T>::EndOfInput
);
43
44
if
(tmp_fd >= 0) {
45
;
46
}
else
if
(proc->
start
(
ARDOUR::SystemExec::ShareWithParent
)) {
47
throw
ARDOUR::ExportFailed
(
"External encoder (ffmpeg) cannot be started."
);
48
}
49
proc->
Terminated
.connect_same_thread (
exec_connections
, std::bind (&
CmdPipeWriter::encode_complete
,
this
));
50
}
51
52
virtual
~CmdPipeWriter
() {
53
delete
_proc
;
54
if
(
_tmp_fd
>= 0) {
55
::close
(
_tmp_fd
);
56
}
57
if
(
_tmp_file
) {
58
g_unlink (
_tmp_file
);
59
g_free (
_tmp_file
);
60
}
61
}
62
63
samplecnt_t
get_samples_written
()
const
{
return
samples_written
; }
64
void
reset_samples_written_count
() {
samples_written
= 0; }
65
66
void
flush
(
void
)
67
{
68
_proc
->
close_stdin
();
69
_proc
->
wait
();
70
}
71
72
void
close
(
void
)
73
{
74
_proc
->
terminate
();
75
}
76
77
virtual
void
process
(
ProcessContext<T>
const
& c)
78
{
79
check_flags
(*
this
, c);
80
81
if
(
_tmp_fd
< 0 && (!
_proc
|| !
_proc
->
is_running
())) {
82
throw
Exception
(*
this
,
"Target encoder process is not running"
);
83
}
84
85
const
size_t
bytes_per_sample =
sizeof
(T);
86
samplecnt_t
written;
87
if
(
_tmp_fd
>= 0) {
88
written = write (
_tmp_fd
, (
const
void
*) c.
data
(), c.
samples
() * bytes_per_sample) / bytes_per_sample;
89
}
else
{
90
written =
_proc
->
write_to_stdin
((
const
void
*) c.
data
(), c.
samples
() * bytes_per_sample) / bytes_per_sample;
91
}
92
93
samples_written
+= written;
94
95
if
(
throw_level
(
ThrowProcess
) && written != c.
samples
()) {
96
throw
Exception
(*
this
,
"Could not write data to output file"
);
97
}
98
99
if
(c.
has_flag
(
ProcessContext<T>::EndOfInput
)) {
100
if
(
_tmp_fd
>= 0) {
101
::close
(
_tmp_fd
);
102
_tmp_fd
= -1;
103
if
(
_proc
->
start
(
ARDOUR::SystemExec::ShareWithParent
)) {
104
throw
ARDOUR::ExportFailed
(
"External encoder (ffmpeg) cannot be started."
);
105
}
106
assert (
_proc
->
is_running
());
107
}
else
{
108
_proc
->
close_stdin
();
109
}
110
_proc
->
wait
();
111
}
112
}
113
114
using
Sink<T>::process
;
115
116
PBD::Signal
<void(std::string)>
FileWritten
;
117
118
private
:
119
CmdPipeWriter
(
CmdPipeWriter
const
& other) {}
120
121
samplecnt_t
samples_written
;
122
ARDOUR::SystemExec
*
_proc
;
123
std::string
_path
;
124
int
_tmp_fd
;
125
gchar*
_tmp_file
;
126
127
void
encode_complete
() {
128
if
(
_tmp_file
) {
129
g_unlink (
_tmp_file
);
130
g_free (
_tmp_file
);
131
_tmp_file
= NULL;
132
}
133
FileWritten
(
_path
);
134
}
135
136
PBD::ScopedConnectionList
exec_connections
;
137
};
138
139
}
// namespace
140
141
#endif
142
system_exec.h
types.h
ARDOUR::ExportFailed
Definition:
export_failed.h:32
ARDOUR::SystemExec
Definition:
ardour/ardour/system_exec.h:30
ARDOUR::SystemExec::start
int start(StdErrMode stderr_mode=IgnoreAndClose)
Definition:
ardour/ardour/system_exec.h:37
AudioGrapher::CmdPipeWriter
Definition:
cmdpipe_writer.h:33
AudioGrapher::CmdPipeWriter::get_samples_written
samplecnt_t get_samples_written() const
Definition:
cmdpipe_writer.h:63
AudioGrapher::CmdPipeWriter::_path
std::string _path
Definition:
cmdpipe_writer.h:123
AudioGrapher::CmdPipeWriter::close
void close(void)
Definition:
cmdpipe_writer.h:72
AudioGrapher::CmdPipeWriter::_tmp_file
gchar * _tmp_file
Definition:
cmdpipe_writer.h:125
AudioGrapher::CmdPipeWriter::CmdPipeWriter
CmdPipeWriter(CmdPipeWriter const &other)
Definition:
cmdpipe_writer.h:119
AudioGrapher::CmdPipeWriter::process
virtual void process(ProcessContext< T > const &c)
Definition:
cmdpipe_writer.h:77
AudioGrapher::CmdPipeWriter::CmdPipeWriter
CmdPipeWriter(ARDOUR::SystemExec *proc, std::string const &path, int tmp_fd=-1, gchar *tmp_file=0)
Definition:
cmdpipe_writer.h:35
AudioGrapher::CmdPipeWriter::samples_written
samplecnt_t samples_written
Definition:
cmdpipe_writer.h:121
AudioGrapher::CmdPipeWriter::encode_complete
void encode_complete()
Definition:
cmdpipe_writer.h:127
AudioGrapher::CmdPipeWriter::reset_samples_written_count
void reset_samples_written_count()
Definition:
cmdpipe_writer.h:64
AudioGrapher::CmdPipeWriter::FileWritten
PBD::Signal< void(std::string)> FileWritten
Definition:
cmdpipe_writer.h:116
AudioGrapher::CmdPipeWriter::exec_connections
PBD::ScopedConnectionList exec_connections
Definition:
cmdpipe_writer.h:136
AudioGrapher::CmdPipeWriter::flush
void flush(void)
Definition:
cmdpipe_writer.h:66
AudioGrapher::CmdPipeWriter::_tmp_fd
int _tmp_fd
Definition:
cmdpipe_writer.h:124
AudioGrapher::CmdPipeWriter::~CmdPipeWriter
virtual ~CmdPipeWriter()
Definition:
cmdpipe_writer.h:52
AudioGrapher::CmdPipeWriter::_proc
ARDOUR::SystemExec * _proc
Definition:
cmdpipe_writer.h:122
AudioGrapher::FlagDebuggable
A debugging class for nodes that support a certain set of flags.
Definition:
flag_debuggable.h:16
AudioGrapher::FlagDebuggable::check_flags
void check_flags(SelfType &self, ProcessContext< ContextType > context)
Prints debug output if context contains flags that are not supported by this class.
Definition:
flag_debuggable.h:30
AudioGrapher::FlagDebuggable::add_supported_flag
void add_supported_flag(Flag flag)
Adds a flag to the set of flags supported.
Definition:
flag_debuggable.h:23
AudioGrapher::ProcessContext
Definition:
process_context.h:25
AudioGrapher::ProcessContext::has_flag
bool has_flag(Flag flag) const
Definition:
process_context.h:100
AudioGrapher::ProcessContext::data
T const * data() const
data points to the array of data to process
Definition:
process_context.h:84
AudioGrapher::ProcessContext::samples
samplecnt_t const & samples() const
samples tells how many samples the array pointed by data contains
Definition:
process_context.h:88
AudioGrapher::Sink
Definition:
sink.h:17
AudioGrapher::Throwing
Definition:
throwing.h:44
AudioGrapher::Throwing::throw_level
bool throw_level(ThrowLevel level)
Definition:
throwing.h:47
PBD::ScopedConnectionList
Definition:
signals.h:284
PBD::Signal
Definition:
signals.h:184
PBD::SystemExec::wait
int wait(int options=0)
PBD::SystemExec::close_stdin
void close_stdin()
PBD::SystemExec::is_running
bool is_running()
PBD::SystemExec::Terminated
PBD::Signal< void()> Terminated
Definition:
pbd/pbd/system_exec.h:212
PBD::SystemExec::write_to_stdin
size_t write_to_stdin(std::string const &d, size_t len=0)
PBD::SystemExec::terminate
void terminate()
PBD::SystemExec::ShareWithParent
@ ShareWithParent
Definition:
pbd/pbd/system_exec.h:126
export_failed.h
flag_debuggable.h
gstdio_compat.h
io.h
AudioGrapher
Definition:
analysis_graph.h:33
AudioGrapher::ThrowProcess
@ ThrowProcess
Process cycle level stuff.
Definition:
throwing.h:23
AudioGrapher::samplecnt_t
int64_t samplecnt_t
Definition:
audiographer/audiographer/types.h:11
Select::Exception
@ Exception
Definition:
libs/pbd/pbd/selectable.h:35
signals.h
sink.h
libs
audiographer
audiographer
general
cmdpipe_writer.h
Generated on Fri Mar 13 2026 07:22:33 for Ardour by
1.9.1