aboutsummaryrefslogtreecommitdiff
path: root/Src/Plugins/Input/in_mp3/RawMediaReader.cpp
blob: 5a532639053c33af31ac49fc5ceb66fb2c784810 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
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