filter/FilterInternal: split class Filter, add class PreparedFilter

For easier state management inside filter plugins.
This commit is contained in:
Max Kellermann
2016-06-22 11:15:49 +02:00
parent 5c75096bcd
commit 3a21241248
26 changed files with 615 additions and 388 deletions

View File

@@ -32,6 +32,8 @@
#include "system/FatalError.hxx"
#include "Log.hxx"
#include <memory>
#include <assert.h>
#include <string.h>
#include <stdlib.h>
@@ -46,7 +48,7 @@ mixer_set_volume(gcc_unused Mixer *mixer,
return true;
}
static Filter *
static PreparedFilter *
load_filter(const char *name)
{
const auto *param = config_find_block(ConfigBlockOption::AUDIO_FILTER,
@@ -57,7 +59,7 @@ load_filter(const char *name)
}
Error error;
Filter *filter = filter_configured_new(*param, error);
auto *filter = filter_configured_new(*param, error);
if (filter == NULL) {
LogError(error, "Failed to load filter");
return NULL;
@@ -97,20 +99,22 @@ try {
/* initialize the filter */
Filter *filter = load_filter(argv[2]);
if (filter == NULL)
std::unique_ptr<PreparedFilter> prepared_filter(load_filter(argv[2]));
if (!prepared_filter)
return EXIT_FAILURE;
/* open the filter */
Error error;
const AudioFormat out_audio_format = filter->Open(audio_format, error);
if (!out_audio_format.IsDefined()) {
std::unique_ptr<Filter> filter(prepared_filter->Open(audio_format,
error));
if (!filter) {
LogError(error, "Failed to open filter");
delete filter;
return EXIT_FAILURE;
}
const AudioFormat out_audio_format = filter->GetOutAudioFormat();
fprintf(stderr, "audio_format=%s\n",
audio_format_to_string(out_audio_format, &af_string));
@@ -127,8 +131,6 @@ try {
error);
if (dest.IsNull()) {
LogError(error, "filter/Filter failed");
filter->Close();
delete filter;
return EXIT_FAILURE;
}
@@ -136,17 +138,12 @@ try {
if (nbytes < 0) {
fprintf(stderr, "Failed to write: %s\n",
strerror(errno));
filter->Close();
delete filter;
return 1;
}
}
/* cleanup and exit */
filter->Close();
delete filter;
config_global_finish();
return EXIT_SUCCESS;