xref: /haiku/src/apps/mediaplayer/supplier/MediaTrackAudioSupplier.h (revision c60fcc87e04b0af21ed9f01581b23d1f714a366f)
15fa5e5feSStephan Aßmus /*
20fc56ed5SStephan Aßmus  * Copyright © 2000-2004 Ingo Weinhold <ingo_weinhold@gmx.de>
30fc56ed5SStephan Aßmus  * Copyright © 2006-2008 Stephan Aßmus <superstippi@gmx.de>
40fc56ed5SStephan Aßmus  * All rights reserved. Distributed under the terms of the MIT License.
55fa5e5feSStephan Aßmus  */
65fa5e5feSStephan Aßmus #ifndef MEDIA_TRACK_AUDIO_SUPPLIER_H
75fa5e5feSStephan Aßmus #define MEDIA_TRACK_AUDIO_SUPPLIER_H
85fa5e5feSStephan Aßmus 
90fc56ed5SStephan Aßmus #include <List.h>
100fc56ed5SStephan Aßmus 
110fc56ed5SStephan Aßmus #include "AudioTrackSupplier.h"
125fa5e5feSStephan Aßmus 
135fa5e5feSStephan Aßmus class BMediaTrack;
140fc56ed5SStephan Aßmus struct media_codec_info;
150fc56ed5SStephan Aßmus struct media_format;
165fa5e5feSStephan Aßmus 
170fc56ed5SStephan Aßmus class MediaTrackAudioSupplier : public AudioTrackSupplier {
185fa5e5feSStephan Aßmus  public:
19e6ac2ec4SStephan Aßmus 								MediaTrackAudioSupplier(BMediaTrack* track,
20e6ac2ec4SStephan Aßmus 									int32 trackIndex);
215fa5e5feSStephan Aßmus 	virtual						~MediaTrackAudioSupplier();
225fa5e5feSStephan Aßmus 
230fc56ed5SStephan Aßmus 	virtual	const media_format&	Format() const;
242a72b9feSStephan Aßmus 	virtual	status_t			GetEncodedFormat(media_format* format) const;
252a72b9feSStephan Aßmus 	virtual	status_t			GetCodecInfo(media_codec_info* info) const;
260fc56ed5SStephan Aßmus 	virtual	bigtime_t			Duration() const;
272a72b9feSStephan Aßmus 
280fc56ed5SStephan Aßmus 	// AudioReader interface
290fc56ed5SStephan Aßmus 	// (needed to reuse the class as AudioResampler input)
300fc56ed5SStephan Aßmus 	virtual	status_t			Read(void* buffer, int64 pos, int64 frames);
315fa5e5feSStephan Aßmus 
320fc56ed5SStephan Aßmus 	virtual	status_t			InitCheck() const;
330fc56ed5SStephan Aßmus 
34e6ac2ec4SStephan Aßmus 	virtual	int32				TrackIndex() const
35e6ac2ec4SStephan Aßmus 									{ return fTrackIndex; }
36e6ac2ec4SStephan Aßmus 
370fc56ed5SStephan Aßmus  private:
380fc56ed5SStephan Aßmus 			struct Buffer;
390fc56ed5SStephan Aßmus 			void				_InitFromTrack();
400fc56ed5SStephan Aßmus 
410fc56ed5SStephan Aßmus 			int64				_FramesPerBuffer() const;
420fc56ed5SStephan Aßmus 
430fc56ed5SStephan Aßmus 			void				_CopyFrames(void* source, int64 sourceOffset,
440fc56ed5SStephan Aßmus 									void* target, int64 targetOffset,
450fc56ed5SStephan Aßmus 									int64 position, int64 frames) const;
460fc56ed5SStephan Aßmus 			void				_CopyFrames(Buffer* buffer, void* target,
470fc56ed5SStephan Aßmus 									int64 targetOffset, int64 position,
480fc56ed5SStephan Aßmus 									int64 frames) const;
490fc56ed5SStephan Aßmus 
500fc56ed5SStephan Aßmus 			void				_AllocateBuffers();
510fc56ed5SStephan Aßmus 			void				_FreeBuffers();
520fc56ed5SStephan Aßmus 			Buffer*				_BufferAt(int32 index) const;
530fc56ed5SStephan Aßmus 			Buffer*				_FindBufferAtFrame(int64 frame) const;
540fc56ed5SStephan Aßmus 			Buffer*				_FindUnusedBuffer() const;
550fc56ed5SStephan Aßmus 			Buffer*				_FindUsableBuffer() const;
560fc56ed5SStephan Aßmus 			Buffer*				_FindUsableBufferFor(int64 position) const;
570fc56ed5SStephan Aßmus 			void				_GetBuffersFor(BList& buffers, int64 position,
580fc56ed5SStephan Aßmus 									int64 frames) const;
590fc56ed5SStephan Aßmus 			void				_TouchBuffer(Buffer* buffer);
600fc56ed5SStephan Aßmus 
610fc56ed5SStephan Aßmus 			status_t			_ReadBuffer(Buffer* buffer, int64 position);
620fc56ed5SStephan Aßmus 			status_t			_ReadBuffer(Buffer* buffer, int64 position,
630fc56ed5SStephan Aßmus 									bigtime_t time);
640fc56ed5SStephan Aßmus 
650fc56ed5SStephan Aßmus 			void				_ReadCachedFrames(void*& buffer,
660fc56ed5SStephan Aßmus 									int64& position, int64& frames,
670fc56ed5SStephan Aßmus 									bigtime_t time);
680fc56ed5SStephan Aßmus 
690fc56ed5SStephan Aßmus 			status_t			_ReadUncachedFrames(void* buffer,
700fc56ed5SStephan Aßmus 									int64 position, int64 frames,
710fc56ed5SStephan Aßmus 									bigtime_t time);
720fc56ed5SStephan Aßmus 
730fc56ed5SStephan Aßmus 			status_t			_FindKeyFrameForward(int64& position);
740fc56ed5SStephan Aßmus 			status_t			_FindKeyFrameBackward(int64& position);
75*c60fcc87SStephan Aßmus // NOTE: unused
76*c60fcc87SStephan Aßmus //			status_t			_SeekToKeyFrameForward(int64& position);
770fc56ed5SStephan Aßmus 			status_t			_SeekToKeyFrameBackward(int64& position);
780fc56ed5SStephan Aßmus 
795fa5e5feSStephan Aßmus  private:
805fa5e5feSStephan Aßmus 			BMediaTrack*		fMediaTrack;
810fc56ed5SStephan Aßmus 			char*				fBuffer;
820fc56ed5SStephan Aßmus 			int64				fBufferOffset;
830fc56ed5SStephan Aßmus 			int64				fBufferSize;
840fc56ed5SStephan Aßmus 			BList				fBuffers;
850fc56ed5SStephan Aßmus 			bool				fHasKeyFrames;
860fc56ed5SStephan Aßmus 			int64				fCountFrames;
870fc56ed5SStephan Aßmus 			bool				fReportSeekError;
88e6ac2ec4SStephan Aßmus 			int32				fTrackIndex;
895fa5e5feSStephan Aßmus };
905fa5e5feSStephan Aßmus 
915fa5e5feSStephan Aßmus #endif	// MEDIA_TRACK_AUDIO_SUPPLIER_H
92