1/*
2 * Copyright 2000-2004 Ingo Weinhold <ingo_weinhold@gmx.de>
3 * Copyright 2006-2008 Stephan A��mus <superstippi@gmx.de>
4 * All rights reserved. Distributed under the terms of the MIT License.
5 */
6#ifndef MEDIA_TRACK_AUDIO_SUPPLIER_H
7#define MEDIA_TRACK_AUDIO_SUPPLIER_H
8
9
10#include <List.h>
11
12#include "AudioTrackSupplier.h"
13
14
15class BMediaTrack;
16struct media_codec_info;
17struct media_format;
18
19
20class MediaTrackAudioSupplier : public AudioTrackSupplier {
21public:
22								MediaTrackAudioSupplier(BMediaTrack* track,
23									int32 trackIndex);
24	virtual						~MediaTrackAudioSupplier();
25
26	virtual	const media_format&	Format() const;
27	virtual	status_t			GetEncodedFormat(media_format* format) const;
28	virtual	status_t			GetCodecInfo(media_codec_info* info) const;
29	virtual	bigtime_t			Duration() const;
30
31	// AudioReader interface
32	// (needed to reuse the class as AudioResampler input)
33	virtual bigtime_t			InitialLatency() const;
34	virtual	status_t			Read(void* buffer, int64 pos, int64 frames);
35
36	virtual	status_t			InitCheck() const;
37
38	virtual	int32				TrackIndex() const
39									{ return fTrackIndex; }
40
41private:
42			struct Buffer;
43			void				_InitFromTrack();
44
45			int64				_FramesPerBuffer() const;
46
47			void				_CopyFrames(void* source, int64 sourceOffset,
48									void* target, int64 targetOffset,
49									int64 position, int64 frames) const;
50			void				_CopyFrames(Buffer* buffer, void* target,
51									int64 targetOffset, int64 position,
52									int64 frames) const;
53
54			void				_AllocateBuffers();
55			void				_FreeBuffers();
56			Buffer*				_BufferAt(int32 index) const;
57			Buffer*				_FindBufferAtFrame(int64 frame) const;
58			Buffer*				_FindUnusedBuffer() const;
59			Buffer*				_FindUsableBuffer() const;
60			Buffer*				_FindUsableBufferFor(int64 position) const;
61			void				_GetBuffersFor(BList& buffers, int64 position,
62									int64 frames) const;
63			void				_TouchBuffer(Buffer* buffer);
64
65			status_t			_ReadBuffer(Buffer* buffer, int64 position);
66			status_t			_ReadBuffer(Buffer* buffer, int64 position,
67									bigtime_t time);
68
69			void				_ReadCachedFrames(void*& buffer,
70									int64& position, int64& frames,
71									bigtime_t time);
72
73			status_t			_ReadUncachedFrames(void* buffer,
74									int64 position, int64 frames,
75									bigtime_t time);
76
77			status_t			_FindKeyFrameForward(int64& position);
78			status_t			_FindKeyFrameBackward(int64& position);
79// NOTE: unused
80//			status_t			_SeekToKeyFrameForward(int64& position);
81			status_t			_SeekToKeyFrameBackward(int64& position);
82
83 private:
84			BMediaTrack*		fMediaTrack;
85			char*				fBuffer;
86			int64				fBufferOffset;
87			int64				fBufferSize;
88			BList				fBuffers;
89			bool				fHasKeyFrames;
90			int64				fCountFrames;
91			bool				fReportSeekError;
92			int32				fTrackIndex;
93};
94
95#endif	// MEDIA_TRACK_AUDIO_SUPPLIER_H
96