summaryrefslogtreecommitdiff
path: root/test/RunChromaprint.cxx
diff options
context:
space:
mode:
authorMax Kellermann <max@musicpd.org>2019-04-04 20:29:27 +0200
committerMax Kellermann <max@musicpd.org>2019-04-04 20:29:27 +0200
commit8a07724b23d59493666ada922c7c6dcf872157ae (patch)
treed920a334c0ba31f13a3f3520acf75dc8cce7c386 /test/RunChromaprint.cxx
parent5256929b179bc44405f212d818cd4aa472daab3a (diff)
test/RunChromaprint: move class ChromaprintDecoderClient to lib/chromaprint/
Diffstat (limited to 'test/RunChromaprint.cxx')
-rw-r--r--test/RunChromaprint.cxx127
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) {