xref: /haiku/src/apps/mediaplayer/supplier/MediaTrackAudioSupplier.h (revision 8dd3060da4f50b8de2830fd93216b186efec7c4f)
15fa5e5feSStephan Aßmus /*
2*8dd3060dSAxel Dörfler  * Copyright 2000-2004 Ingo Weinhold <ingo_weinhold@gmx.de>
3*8dd3060dSAxel Dörfler  * 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 
9*8dd3060dSAxel Dörfler 
100fc56ed5SStephan Aßmus #include <List.h>
110fc56ed5SStephan Aßmus 
120fc56ed5SStephan Aßmus #include "AudioTrackSupplier.h"
135fa5e5feSStephan Aßmus 
14*8dd3060dSAxel Dörfler 
155fa5e5feSStephan Aßmus class BMediaTrack;
160fc56ed5SStephan Aßmus struct media_codec_info;
170fc56ed5SStephan Aßmus struct media_format;
185fa5e5feSStephan Aßmus 
19*8dd3060dSAxel Dörfler 
200fc56ed5SStephan Aßmus class MediaTrackAudioSupplier : public AudioTrackSupplier {
215fa5e5feSStephan Aßmus public:
22e6ac2ec4SStephan Aßmus 								MediaTrackAudioSupplier(BMediaTrack* track,
23e6ac2ec4SStephan Aßmus 									int32 trackIndex);
245fa5e5feSStephan Aßmus 	virtual						~MediaTrackAudioSupplier();
255fa5e5feSStephan Aßmus 
260fc56ed5SStephan Aßmus 	virtual	const media_format&	Format() const;
272a72b9feSStephan Aßmus 	virtual	status_t			GetEncodedFormat(media_format* format) const;
282a72b9feSStephan Aßmus 	virtual	status_t			GetCodecInfo(media_codec_info* info) const;
290fc56ed5SStephan Aßmus 	virtual	bigtime_t			Duration() const;
302a72b9feSStephan Aßmus 
310fc56ed5SStephan Aßmus 	// AudioReader interface
320fc56ed5SStephan Aßmus 	// (needed to reuse the class as AudioResampler input)
33*8dd3060dSAxel Dörfler 	virtual bigtime_t			InitialLatency() const;
340fc56ed5SStephan Aßmus 	virtual	status_t			Read(void* buffer, int64 pos, int64 frames);
355fa5e5feSStephan Aßmus 
360fc56ed5SStephan Aßmus 	virtual	status_t			InitCheck() const;
370fc56ed5SStephan Aßmus 
TrackIndex()38e6ac2ec4SStephan Aßmus 	virtual	int32				TrackIndex() const
39e6ac2ec4SStephan Aßmus 									{ return fTrackIndex; }
40e6ac2ec4SStephan Aßmus 
410fc56ed5SStephan Aßmus private:
420fc56ed5SStephan Aßmus 			struct Buffer;
430fc56ed5SStephan Aßmus 			void				_InitFromTrack();
440fc56ed5SStephan Aßmus 
450fc56ed5SStephan Aßmus 			int64				_FramesPerBuffer() const;
460fc56ed5SStephan Aßmus 
470fc56ed5SStephan Aßmus 			void				_CopyFrames(void* source, int64 sourceOffset,
480fc56ed5SStephan Aßmus 									void* target, int64 targetOffset,
490fc56ed5SStephan Aßmus 									int64 position, int64 frames) const;
500fc56ed5SStephan Aßmus 			void				_CopyFrames(Buffer* buffer, void* target,
510fc56ed5SStephan Aßmus 									int64 targetOffset, int64 position,
520fc56ed5SStephan Aßmus 									int64 frames) const;
530fc56ed5SStephan Aßmus 
540fc56ed5SStephan Aßmus 			void				_AllocateBuffers();
550fc56ed5SStephan Aßmus 			void				_FreeBuffers();
560fc56ed5SStephan Aßmus 			Buffer*				_BufferAt(int32 index) const;
570fc56ed5SStephan Aßmus 			Buffer*				_FindBufferAtFrame(int64 frame) const;
580fc56ed5SStephan Aßmus 			Buffer*				_FindUnusedBuffer() const;
590fc56ed5SStephan Aßmus 			Buffer*				_FindUsableBuffer() const;
600fc56ed5SStephan Aßmus 			Buffer*				_FindUsableBufferFor(int64 position) const;
610fc56ed5SStephan Aßmus 			void				_GetBuffersFor(BList& buffers, int64 position,
620fc56ed5SStephan Aßmus 									int64 frames) const;
630fc56ed5SStephan Aßmus 			void				_TouchBuffer(Buffer* buffer);
640fc56ed5SStephan Aßmus 
650fc56ed5SStephan Aßmus 			status_t			_ReadBuffer(Buffer* buffer, int64 position);
660fc56ed5SStephan Aßmus 			status_t			_ReadBuffer(Buffer* buffer, int64 position,
670fc56ed5SStephan Aßmus 									bigtime_t time);
680fc56ed5SStephan Aßmus 
690fc56ed5SStephan Aßmus 			void				_ReadCachedFrames(void*& buffer,
700fc56ed5SStephan Aßmus 									int64& position, int64& frames,
710fc56ed5SStephan Aßmus 									bigtime_t time);
720fc56ed5SStephan Aßmus 
730fc56ed5SStephan Aßmus 			status_t			_ReadUncachedFrames(void* buffer,
740fc56ed5SStephan Aßmus 									int64 position, int64 frames,
750fc56ed5SStephan Aßmus 									bigtime_t time);
760fc56ed5SStephan Aßmus 
770fc56ed5SStephan Aßmus 			status_t			_FindKeyFrameForward(int64& position);
780fc56ed5SStephan Aßmus 			status_t			_FindKeyFrameBackward(int64& position);
79c60fcc87SStephan Aßmus // NOTE: unused
80c60fcc87SStephan Aßmus //			status_t			_SeekToKeyFrameForward(int64& position);
810fc56ed5SStephan Aßmus 			status_t			_SeekToKeyFrameBackward(int64& position);
820fc56ed5SStephan Aßmus 
835fa5e5feSStephan Aßmus  private:
845fa5e5feSStephan Aßmus 			BMediaTrack*		fMediaTrack;
850fc56ed5SStephan Aßmus 			char*				fBuffer;
860fc56ed5SStephan Aßmus 			int64				fBufferOffset;
870fc56ed5SStephan Aßmus 			int64				fBufferSize;
880fc56ed5SStephan Aßmus 			BList				fBuffers;
890fc56ed5SStephan Aßmus 			bool				fHasKeyFrames;
900fc56ed5SStephan Aßmus 			int64				fCountFrames;
910fc56ed5SStephan Aßmus 			bool				fReportSeekError;
92e6ac2ec4SStephan Aßmus 			int32				fTrackIndex;
935fa5e5feSStephan Aßmus };
945fa5e5feSStephan Aßmus 
955fa5e5feSStephan Aßmus #endif	// MEDIA_TRACK_AUDIO_SUPPLIER_H
96