1/*
2 * OpenSound media addon for BeOS and Haiku
3 *
4 * Copyright (c) 2007, Fran��ois Revol (revol@free.fr)
5 * Distributed under the terms of the MIT License.
6 */
7
8#ifndef _OPENSOUNDDEVICEENGINE_H
9#define _OPENSOUNDDEVICEENGINE_H
10
11#include "OpenSoundDevice.h"
12
13class OpenSoundDeviceEngine
14{
15	public:
16		OpenSoundDeviceEngine(oss_audioinfo *info);
17		virtual ~OpenSoundDeviceEngine(void);
18
19		virtual status_t InitCheck(void) const;
20		int			FD() const { return fFD; };
21		const oss_audioinfo *Info() const { return &fAudioInfo; };
22
23		status_t	Open(int mode/* OPEN_* */);
24		status_t	Close();
25
26		//BDadaIO...
27virtual	ssize_t		Read(void *buffer, size_t size);
28virtual	ssize_t		Write(const void *buffer, size_t size);
29
30
31		/* chain of engines for the same physical in/out */
32		OpenSoundDeviceEngine *NextPlay() const { return fNextPlay; };
33		OpenSoundDeviceEngine *NextRec() const { return fNextRec; };
34
35		int			OpenMode() const { return fOpenMode; };
36		bool		InUse() const { return (fOpenMode != 0); };
37
38		status_t	UpdateInfo();
39		// shortcuts
40		int			Caps() const { return fAudioInfo.caps; };
41		bigtime_t	CardLatency(void) const { return (fAudioInfo.latency < 0) ? 0 : fAudioInfo.latency; };
42		bigtime_t	PlaybackLatency(void);
43		bigtime_t	RecordingLatency(void);
44
45
46		int			GetChannels(void);
47		status_t	SetChannels(int chans);
48
49		int			GetFormat(void);
50		status_t	SetFormat(int fmt);
51
52		int			GetSpeed(void);
53		status_t	SetSpeed(int speed);
54
55		void		GetMediaFormat(media_format &format);
56
57		size_t		GetISpace(audio_buf_info *info=NULL);
58		size_t		GetOSpace(audio_buf_info *info=NULL);
59
60		int64		GetCurrentIPtr(int32* fifoed = NULL,
61						oss_count_t* info = NULL);
62		int64		GetCurrentOPtr(int32* fifoed = NULL,
63						size_t* fragmentPos = NULL);
64
65		int32		GetIOverruns();
66		int32		GetOUnderruns();
67
68		size_t		DriverBufferSize() const;
69
70		status_t	StartRecording(void);
71
72		// suggest possibles
73		status_t	WildcardFormatFor(int fmt, media_format &format, bool rec=false);
74		// suggest best
75		status_t	PreferredFormatFor(int fmt, media_format &format, bool rec=false);
76		// try this format
77		status_t	AcceptFormatFor(int fmt, media_format &format, bool rec=false);
78		// apply this format
79		status_t	SpecializeFormatFor(int fmt, media_format &format, bool rec=true);
80
81	private:
82		status_t 				fInitCheckStatus;
83		oss_audioinfo			fAudioInfo;
84friend class OpenSoundAddOn;
85		OpenSoundDeviceEngine	*fNextPlay;
86		OpenSoundDeviceEngine	*fNextRec;
87		int						fOpenMode; // OPEN_*
88		int						fFD;
89		media_format			fMediaFormat;
90		int64					fPlayedFramesCount;
91		bigtime_t				fPlayedRealTime;
92		size_t					fDriverBufferSize;
93};
94
95#endif
96