aboutsummaryrefslogtreecommitdiff
path: root/Src/Plugins/Input/in_flac/RawReader.cpp
diff options
context:
space:
mode:
authorJef <jef@targetspot.com>2024-09-24 08:54:57 -0400
committerJef <jef@targetspot.com>2024-09-24 08:54:57 -0400
commit20d28e80a5c861a9d5f449ea911ab75b4f37ad0d (patch)
tree12f17f78986871dd2cfb0a56e5e93b545c1ae0d0 /Src/Plugins/Input/in_flac/RawReader.cpp
parent537bcbc86291b32fc04ae4133ce4d7cac8ebe9a7 (diff)
downloadwinamp-20d28e80a5c861a9d5f449ea911ab75b4f37ad0d.tar.gz
Initial community commit
Diffstat (limited to 'Src/Plugins/Input/in_flac/RawReader.cpp')
-rw-r--r--Src/Plugins/Input/in_flac/RawReader.cpp174
1 files changed, 174 insertions, 0 deletions
diff --git a/Src/Plugins/Input/in_flac/RawReader.cpp b/Src/Plugins/Input/in_flac/RawReader.cpp
new file mode 100644
index 00000000..9c6814f5
--- /dev/null
+++ b/Src/Plugins/Input/in_flac/RawReader.cpp
@@ -0,0 +1,174 @@
+#ifndef WIN32_LEAN_AND_MEAN
+#define WIN32_LEAN_AND_MEAN
+#endif
+#include "RawReader.h"
+#include "main.h"
+#include <limits.h>
+#include <shlwapi.h>
+#include "../nu/AutoWide.h"
+#include <new>
+#include <strsafe.h>
+#include "nswasabi/ReferenceCounted.h"
+
+static bool IsMyExtension(const wchar_t *filename)
+{
+ const wchar_t *extension = PathFindExtensionW(filename);
+ if (extension && *extension)
+ {
+ wchar_t exts[128] = {0};
+ GetPrivateProfileStringW(L"in_flac", L"extensions", DEFAULT_EXTENSIONSW, exts, 128, winampINI);
+
+ extension++;
+ wchar_t *b = exts;
+ wchar_t *c;
+ do
+ {
+ wchar_t d[20] = {0};
+ StringCchCopyW(d, 15, b);
+ if ((c = wcschr(b, L';')))
+ {
+ if ((c-b)<15)
+ d[c - b] = 0;
+ }
+
+ if (!lstrcmpiW(extension, d))
+ return true;
+
+ b = c + 1;
+ }
+ while (c);
+ }
+ return false;
+}
+
+int RawMediaReaderService::CreateRawMediaReader(const wchar_t *filename, ifc_raw_media_reader **out_reader)
+{
+ if (IsMyExtension(filename))
+ {
+ nx_file_t file;
+ ReferenceCountedNXString filename_nx;
+ ReferenceCountedNXURI filename_uri;
+ NXStringCreateWithUTF16(&filename_nx, filename);
+ NXURICreateWithNXString(&filename_uri, filename_nx);
+
+ int ret = NXFileOpenFile(&file, filename_uri, nx_file_FILE_read_binary);
+ if (ret != NErr_Success)
+ return ret;
+
+ RawMediaReader *reader = new (std::nothrow) RawMediaReader();
+ if (!reader)
+ {
+ NXFileRelease(file);
+ return NErr_OutOfMemory;
+ }
+
+ ret = reader->Initialize(file);
+ NXFileRelease(file);
+ if (ret != NErr_Success)
+ {
+ delete reader;
+ return ret;
+ }
+
+ *out_reader = reader;
+ return NErr_Success;
+
+ }
+ else
+ {
+ return NErr_False;
+ }
+}
+
+#define CBCLASS RawMediaReaderService
+START_DISPATCH;
+CB(CREATERAWMEDIAREADER, CreateRawMediaReader);
+END_DISPATCH;
+#undef CBCLASS
+
+static void OnError(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data)
+{
+ //client_data=client_data; // dummy line so i can set a breakpoint
+}
+
+static void OnMetadata(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data)
+{
+
+}
+
+static FLAC__StreamDecoderWriteStatus OnAudio(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 *const buffer[], void *client_data)
+{
+
+ return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
+}
+
+RawMediaReader::RawMediaReader()
+{
+ decoder=0;
+ file=0;
+}
+
+RawMediaReader::~RawMediaReader()
+{
+ if (decoder)
+ FLAC__stream_decoder_delete(decoder);
+ NXFileRelease(file);
+}
+
+int RawMediaReader::Initialize(nx_file_t file)
+{
+ this->file = NXFileRetain(file);
+ decoder = FLAC__stream_decoder_new();
+ if (!decoder)
+ return NErr_FailedCreate;
+
+ FLAC__stream_decoder_set_metadata_ignore(decoder, FLAC__METADATA_TYPE_VORBIS_COMMENT);
+ state.SetFile(file);
+ state.SetObject(this);
+ FLAC__stream_decoder_set_md5_checking(decoder, true);
+ if(FLAC__stream_decoder_init_stream(
+ decoder,
+ FLAC_NXFile_Read,
+ FLAC_NXFile_Seek,
+ FLAC_NXFile_Tell,
+ FLAC_NXFile_Length,
+ FLAC_NXFile_EOF,
+ OnAudio,
+ OnMetadata,
+ OnError,
+ &state
+ ) != FLAC__STREAM_DECODER_INIT_STATUS_OK)
+ {
+ FLAC__stream_decoder_delete(decoder);
+ decoder=0;
+ return NErr_Error;
+ }
+
+ FLAC__stream_decoder_process_until_end_of_metadata(decoder);
+ uint64_t position;
+ FLAC__stream_decoder_get_decode_position(decoder, &position);
+ FLAC__stream_decoder_delete(decoder);
+ decoder=0;
+ NXFileSeek(file, position);
+
+ return NErr_Success;
+}
+
+int RawMediaReader::Read(void *buffer, size_t buffer_size, size_t *bytes_read)
+{
+ return NXFileRead(file, buffer, buffer_size, bytes_read);
+}
+
+size_t RawMediaReader::Release()
+{
+
+ delete this;
+ return 0;
+}
+
+#define CBCLASS RawMediaReader
+START_DISPATCH;
+CB(RELEASE, Release);
+CB(RAW_READ, Read);
+END_DISPATCH;
+#undef CBCLASS \ No newline at end of file