Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
M
mpd
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Иван Мажукин
mpd
Commits
dd9ab16d
Commit
dd9ab16d
authored
Nov 07, 2016
by
Max Kellermann
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
output/recorder: migrate from class Error to C++ exceptions
parent
d8b6aff2
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
27 additions
and
79 deletions
+27
-79
RecorderOutputPlugin.cxx
src/output/plugins/RecorderOutputPlugin.cxx
+27
-79
No files found.
src/output/plugins/RecorderOutputPlugin.cxx
View file @
dd9ab16d
...
...
@@ -31,7 +31,7 @@
#include "Log.hxx"
#include "fs/AllocatedPath.hxx"
#include "fs/io/FileOutputStream.hxx"
#include "util/Error.hxx"
#include "util/
Runtime
Error.hxx"
#include "util/Domain.hxx"
#include "util/ScopeExit.hxx"
...
...
@@ -75,21 +75,14 @@ class RecorderOutput {
*/
FileOutputStream
*
file
;
RecorderOutput
()
:
base
(
recorder_output_plugin
)
{}
RecorderOutput
(
const
ConfigBlock
&
block
);
~
RecorderOutput
()
{
delete
prepared_encoder
;
}
bool
Initialize
(
const
ConfigBlock
&
block
,
Error
&
error_r
)
{
return
base
.
Configure
(
block
,
error_r
);
}
static
RecorderOutput
*
Create
(
const
ConfigBlock
&
block
,
Error
&
error
);
bool
Configure
(
const
ConfigBlock
&
block
,
Error
&
error
);
bool
Open
(
AudioFormat
&
audio_format
,
Error
&
error
);
void
Close
();
...
...
@@ -116,22 +109,19 @@ private:
void
Commit
();
void
FinishFormat
();
bool
ReopenFormat
(
AllocatedPath
&&
new_path
,
Error
&
error
);
void
ReopenFormat
(
AllocatedPath
&&
new_path
);
};
inline
bool
RecorderOutput
::
Configure
(
const
ConfigBlock
&
block
,
Error
&
error
)
RecorderOutput
::
RecorderOutput
(
const
ConfigBlock
&
block
)
:
base
(
recorder_output_plugin
,
block
)
{
/* read configuration */
const
char
*
encoder_name
=
block
.
GetBlockValue
(
"encoder"
,
"vorbis"
);
const
auto
encoder_plugin
=
encoder_plugin_get
(
encoder_name
);
if
(
encoder_plugin
==
nullptr
)
{
error
.
Format
(
config_domain
,
"No such encoder: %s"
,
encoder_name
);
return
false
;
}
if
(
encoder_plugin
==
nullptr
)
throw
FormatRuntimeError
(
"No such encoder: %s"
,
encoder_name
);
path
=
block
.
GetPath
(
"path"
);
...
...
@@ -139,44 +129,21 @@ RecorderOutput::Configure(const ConfigBlock &block, Error &error)
if
(
fmt
!=
nullptr
)
format_path
=
fmt
;
if
(
path
.
IsNull
()
&&
fmt
==
nullptr
)
{
error
.
Set
(
config_domain
,
"'path' not configured"
);
return
false
;
}
if
(
path
.
IsNull
()
&&
fmt
==
nullptr
)
throw
std
::
runtime_error
(
"'path' not configured"
);
if
(
!
path
.
IsNull
()
&&
fmt
!=
nullptr
)
{
error
.
Set
(
config_domain
,
"Cannot have both 'path' and 'format_path'"
);
return
false
;
}
if
(
!
path
.
IsNull
()
&&
fmt
!=
nullptr
)
throw
std
::
runtime_error
(
"Cannot have both 'path' and 'format_path'"
);
/* initialize encoder */
prepared_encoder
=
encoder_init
(
*
encoder_plugin
,
block
);
return
true
;
}
RecorderOutput
*
RecorderOutput
::
Create
(
const
ConfigBlock
&
block
,
Error
&
error
)
RecorderOutput
::
Create
(
const
ConfigBlock
&
block
,
Error
&
)
{
RecorderOutput
*
recorder
=
new
RecorderOutput
();
try
{
if
(
!
recorder
->
Initialize
(
block
,
error
))
{
delete
recorder
;
return
nullptr
;
}
if
(
!
recorder
->
Configure
(
block
,
error
))
{
delete
recorder
;
return
nullptr
;
}
}
catch
(...)
{
delete
recorder
;
throw
;
}
return
recorder
;
return
new
RecorderOutput
(
block
);
}
inline
void
...
...
@@ -188,19 +155,14 @@ RecorderOutput::EncoderToFile()
}
inline
bool
RecorderOutput
::
Open
(
AudioFormat
&
audio_format
,
Error
&
error
)
RecorderOutput
::
Open
(
AudioFormat
&
audio_format
,
Error
&
)
{
/* create the output file */
if
(
!
HasDynamicPath
())
{
assert
(
!
path
.
IsNull
());
try
{
file
=
new
FileOutputStream
(
path
);
}
catch
(
const
std
::
exception
&
e
)
{
error
.
Set
(
recorder_domain
,
e
.
what
());
return
false
;
}
file
=
new
FileOutputStream
(
path
);
}
else
{
/* don't open the file just yet; wait until we have
a tag that we can use to build the path */
...
...
@@ -221,10 +183,9 @@ RecorderOutput::Open(AudioFormat &audio_format, Error &error)
if
(
!
HasDynamicPath
())
{
try
{
EncoderToFile
();
}
catch
(
const
std
::
exception
&
e
)
{
}
catch
(
const
std
::
runtime_error
&
)
{
delete
encoder
;
error
.
Set
(
recorder_domain
,
e
.
what
());
return
false
;
throw
;
}
}
else
{
/* remember the AudioFormat for ReopenFormat() */
...
...
@@ -308,20 +269,14 @@ RecorderOutput::FinishFormat()
path
.
SetNull
();
}
inline
bool
RecorderOutput
::
ReopenFormat
(
AllocatedPath
&&
new_path
,
Error
&
error
)
inline
void
RecorderOutput
::
ReopenFormat
(
AllocatedPath
&&
new_path
)
{
assert
(
HasDynamicPath
());
assert
(
path
.
IsNull
());
assert
(
file
==
nullptr
);
FileOutputStream
*
new_file
;
try
{
new_file
=
new
FileOutputStream
(
path
);
}
catch
(
const
std
::
exception
&
e
)
{
error
.
Set
(
recorder_domain
,
e
.
what
());
return
false
;
}
FileOutputStream
*
new_file
=
new
FileOutputStream
(
path
);
AudioFormat
new_audio_format
=
effective_audio_format
;
...
...
@@ -341,8 +296,7 @@ RecorderOutput::ReopenFormat(AllocatedPath &&new_path, Error &error)
}
catch
(
const
std
::
exception
&
e
)
{
delete
encoder
;
delete
new_file
;
error
.
Set
(
recorder_domain
,
e
.
what
());
return
false
;
throw
;
}
path
=
std
::
move
(
new_path
);
...
...
@@ -350,8 +304,6 @@ RecorderOutput::ReopenFormat(AllocatedPath &&new_path, Error &error)
FormatDebug
(
recorder_domain
,
"Recording to
\"
%s
\"
"
,
path
.
ToUTF8
().
c_str
());
return
true
;
}
inline
void
...
...
@@ -382,9 +334,10 @@ RecorderOutput::SendTag(const Tag &tag)
if
(
new_path
!=
path
)
{
FinishFormat
();
Error
error
;
if
(
!
ReopenFormat
(
std
::
move
(
new_path
),
error
))
{
LogError
(
error
);
try
{
ReopenFormat
(
std
::
move
(
new_path
));
}
catch
(
const
std
::
runtime_error
&
e
)
{
LogError
(
e
);
return
;
}
}
...
...
@@ -396,7 +349,7 @@ RecorderOutput::SendTag(const Tag &tag)
}
inline
size_t
RecorderOutput
::
Play
(
const
void
*
chunk
,
size_t
size
,
Error
&
error
)
RecorderOutput
::
Play
(
const
void
*
chunk
,
size_t
size
,
Error
&
)
{
if
(
file
==
nullptr
)
{
/* not currently encoding to a file; discard incoming
...
...
@@ -408,12 +361,7 @@ RecorderOutput::Play(const void *chunk, size_t size, Error &error)
encoder
->
Write
(
chunk
,
size
);
try
{
EncoderToFile
();
}
catch
(
const
std
::
exception
&
e
)
{
error
.
Set
(
recorder_domain
,
e
.
what
());
return
0
;
}
EncoderToFile
();
return
size
;
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment