aboutsummaryrefslogtreecommitdiff
path: root/Src/Plugins/Input/in_mp3/RawMediaReader.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Src/Plugins/Input/in_mp3/RawMediaReader.cpp')
-rw-r--r--Src/Plugins/Input/in_mp3/RawMediaReader.cpp84
1 files changed, 84 insertions, 0 deletions
diff --git a/Src/Plugins/Input/in_mp3/RawMediaReader.cpp b/Src/Plugins/Input/in_mp3/RawMediaReader.cpp
new file mode 100644
index 00000000..5a532639
--- /dev/null
+++ b/Src/Plugins/Input/in_mp3/RawMediaReader.cpp
@@ -0,0 +1,84 @@
+#include "RawMediaReader.h"
+#include <limits.h>
+
+bool IsMyExtension(const wchar_t *filename);
+
+int RawMediaReaderService::CreateRawMediaReader(const wchar_t *filename, ifc_raw_media_reader **out_reader)
+{
+ if (IsMyExtension(filename))
+ {
+ CGioFile *file = new CGioFile();
+ if (!file)
+ return NErr_OutOfMemory;
+
+ if (file->Open(filename, 0) != NErr_Success)
+ {
+ delete file;
+ return NErr_FileNotFound;
+ }
+
+ RawMediaReader *reader = new RawMediaReader(file);
+ if (!reader)
+ {
+ file->Close();
+ delete file;
+ return NErr_OutOfMemory;
+ }
+
+ *out_reader = reader;
+ return NErr_Success;
+ }
+ else
+ {
+ return NErr_False;
+ }
+}
+
+#define CBCLASS RawMediaReaderService
+START_DISPATCH;
+CB(CREATERAWMEDIAREADER, CreateRawMediaReader);
+END_DISPATCH;
+#undef CBCLASS
+
+RawMediaReader::RawMediaReader(CGioFile *file) : file(file)
+{}
+
+int RawMediaReader::Read( void *buffer, size_t buffer_size, size_t *bytes_read )
+{
+ if ( buffer_size > INT_MAX )
+ return NErr_BadParameter;
+
+ int file_bytes_read = 0;
+ int ret = file->Read( buffer, (int)buffer_size, &file_bytes_read );
+
+ if ( ret == NErr_Success )
+ {
+ *bytes_read = (size_t)file_bytes_read;
+ if ( !file_bytes_read && file->IsEof() )
+ return NErr_EndOfFile;
+
+ return NErr_Success;
+ }
+ else
+ return NErr_Error;
+}
+
+size_t RawMediaReader::Release()
+{
+ file->Close();
+
+ delete file;
+ file = NULL;
+
+ delete this;
+
+ return 0;
+}
+
+
+#define CBCLASS RawMediaReader
+START_DISPATCH;
+CB( RELEASE, Release );
+CB( RAW_READ, Read );
+END_DISPATCH;
+#undef CBCLASS