diff options
author | Max Kellermann <max@musicpd.org> | 2019-04-04 20:29:27 +0200 |
---|---|---|
committer | Max Kellermann <max@musicpd.org> | 2019-04-04 20:29:27 +0200 |
commit | 8a07724b23d59493666ada922c7c6dcf872157ae (patch) | |
tree | d920a334c0ba31f13a3f3520acf75dc8cce7c386 /test/RunChromaprint.cxx | |
parent | 5256929b179bc44405f212d818cd4aa472daab3a (diff) |
test/RunChromaprint: move class ChromaprintDecoderClient to lib/chromaprint/
Diffstat (limited to 'test/RunChromaprint.cxx')
-rw-r--r-- | test/RunChromaprint.cxx | 127 |
1 files changed, 4 insertions, 123 deletions
diff --git a/test/RunChromaprint.cxx b/test/RunChromaprint.cxx index 9c7a161fc..cfcfb7f60 100644 --- a/test/RunChromaprint.cxx +++ b/test/RunChromaprint.cxx @@ -1,5 +1,5 @@ /* - * Copyright 2003-2018 The Music Player Daemon Project + * Copyright 2003-2019 The Music Player Daemon Project * http://www.musicpd.org * * This program is free software; you can redistribute it and/or modify @@ -18,12 +18,10 @@ */ #include "ConfigGlue.hxx" -#include "lib/chromaprint/Context.hxx" -#include "pcm/PcmConvert.hxx" +#include "lib/chromaprint/DecoderClient.hxx" #include "event/Thread.hxx" #include "decoder/DecoderList.hxx" #include "decoder/DecoderPlugin.hxx" -#include "decoder/Client.hxx" #include "input/Init.hxx" #include "input/InputStream.hxx" #include "fs/Path.hxx" @@ -105,130 +103,13 @@ public: } }; -class ChromaprintDecoderClient final : public DecoderClient { - bool ready = false; - - bool need_convert = false; - - PcmConvert convert; - - Chromaprint::Context chromaprint; - - uint64_t remaining_bytes; - +class MyChromaprintDecoderClient final : public ChromaprintDecoderClient { public: - Mutex mutex; - - ~ChromaprintDecoderClient() noexcept { - if (need_convert) - convert.Close(); - } - - void PrintResult(); - - /* virtual methods from DecoderClient */ - void Ready(AudioFormat audio_format, - bool seekable, SignedSongTime duration) override; - - DecoderCommand GetCommand() noexcept override { - return remaining_bytes > 0 - ? DecoderCommand::NONE - : DecoderCommand::STOP; - } - - void CommandFinished() override {} - - SongTime GetSeekTime() noexcept override { - return SongTime::zero(); - } - - uint64_t GetSeekFrame() noexcept override { - return 0; - } - - void SeekError() override {} - InputStreamPtr OpenUri(const char *) override { throw std::runtime_error("Not implemented"); } - - size_t Read(InputStream &is, void *buffer, size_t length) override { - return is.LockRead(buffer, length); - } - - void SubmitTimestamp(FloatDuration) override {} - DecoderCommand SubmitData(InputStream *is, - const void *data, size_t length, - uint16_t kbit_rate) override; - - DecoderCommand SubmitTag(InputStream *, Tag &&) override { - return GetCommand(); - } - - void SubmitReplayGain(const ReplayGainInfo *) override {} - void SubmitMixRamp(MixRampInfo &&) override {} }; -void -ChromaprintDecoderClient::PrintResult() -{ - if (!ready) - throw std::runtime_error("Decoding failed"); - - if (need_convert) { - auto flushed = convert.Flush(); - auto data = ConstBuffer<int16_t>::FromVoid(flushed); - chromaprint.Feed(data.data, data.size); - } - - chromaprint.Finish(); - - printf("%s\n", chromaprint.GetFingerprint().c_str()); -} - -void -ChromaprintDecoderClient::Ready(AudioFormat audio_format, bool, SignedSongTime) -{ - /* feed the first two minutes into libchromaprint */ - remaining_bytes = audio_format.TimeToSize(std::chrono::minutes(2)); - - if (audio_format.format != SampleFormat::S16) { - const AudioFormat src_audio_format = audio_format; - audio_format.format = SampleFormat::S16; - - convert.Open(src_audio_format, audio_format); - need_convert = true; - } - - chromaprint.Start(audio_format.sample_rate, audio_format.channels); - - ready = true; -} - -DecoderCommand -ChromaprintDecoderClient::SubmitData(InputStream *, - const void *_data, size_t length, - uint16_t) -{ - if (length > remaining_bytes) - remaining_bytes = 0; - else - remaining_bytes -= length; - - ConstBuffer<void> src{_data, length}; - ConstBuffer<int16_t> data; - - if (need_convert) { - auto result = convert.Convert(src); - data = ConstBuffer<int16_t>::FromVoid(result); - } else - data = ConstBuffer<int16_t>::FromVoid(src); - - chromaprint.Feed(data.data, data.size); - - return GetCommand(); -} - int main(int argc, char **argv) try { const auto c = ParseCommandLine(argc, argv); @@ -242,7 +123,7 @@ try { return EXIT_FAILURE; } - ChromaprintDecoderClient client; + MyChromaprintDecoderClient client; if (plugin->file_decode != nullptr) { plugin->FileDecode(client, Path::FromFS(c.uri)); } else if (plugin->stream_decode != nullptr) { |