xref: /haiku/headers/os/media/Sound.h (revision f6e4cbb95290a74b33d012600438b84742b0e572)
152a38012Sejakowatz /*	BSound.h	*/
252a38012Sejakowatz /*	Copyright 1998 Be Incorporated. All rights reserved.	*/
352a38012Sejakowatz 
452a38012Sejakowatz #if !defined(_SOUND_H)
552a38012Sejakowatz #define _SOUND_H
652a38012Sejakowatz 
752a38012Sejakowatz #include <MediaDefs.h>
852a38012Sejakowatz 
9*f6e4cbb9SAxel Dörfler class BMediaFile;
1052a38012Sejakowatz class BSoundFile;
11*f6e4cbb9SAxel Dörfler struct entry_ref;
1252a38012Sejakowatz 
1352a38012Sejakowatz namespace BPrivate {
1452a38012Sejakowatz 	class BTrackReader;
1552a38012Sejakowatz }
1652a38012Sejakowatz 
1752a38012Sejakowatz class BSound {
1852a38012Sejakowatz public:
1952a38012Sejakowatz 		BSound(
2052a38012Sejakowatz 				void * data,
2152a38012Sejakowatz 				size_t size,
2252a38012Sejakowatz 				const media_raw_audio_format & format,
2352a38012Sejakowatz 				bool free_when_done = false);
2452a38012Sejakowatz 		BSound(
2552a38012Sejakowatz 				const entry_ref * sound_file,
2652a38012Sejakowatz 				bool load_into_memory = false);
2752a38012Sejakowatz 
2852a38012Sejakowatz 		status_t InitCheck();
2952a38012Sejakowatz 		BSound * AcquireRef();
3052a38012Sejakowatz 		bool ReleaseRef();
3152a38012Sejakowatz 		int32 RefCount() const;	// unreliable!
3252a38012Sejakowatz 
3352a38012Sejakowatz virtual	bigtime_t Duration() const;
3452a38012Sejakowatz virtual	const media_raw_audio_format & Format() const;
3552a38012Sejakowatz virtual	const void * Data() const;	/* returns NULL for files */
3652a38012Sejakowatz virtual	off_t Size() const;
3752a38012Sejakowatz 
3852a38012Sejakowatz virtual	bool GetDataAt(
3952a38012Sejakowatz 				off_t offset,
4052a38012Sejakowatz 				void * into_buffer,
4152a38012Sejakowatz 				size_t buffer_size,
4252a38012Sejakowatz 				size_t * out_used);
4352a38012Sejakowatz 
4452a38012Sejakowatz protected:
4552a38012Sejakowatz 
4652a38012Sejakowatz 		BSound(
4752a38012Sejakowatz 				const media_raw_audio_format & format);
4852a38012Sejakowatz 
4952a38012Sejakowatz virtual	status_t Perform(
5052a38012Sejakowatz 				int32 code,
5152a38012Sejakowatz 				...);
5252a38012Sejakowatz 
5352a38012Sejakowatz private:
5452a38012Sejakowatz 
5552a38012Sejakowatz 		BSound(const BSound &);	//	unimplemented
5652a38012Sejakowatz 		BSound & operator=(const BSound &);	//	unimplemented
5752a38012Sejakowatz 
5852a38012Sejakowatz 		friend class BSoundPlayer;
5952a38012Sejakowatz 		friend class _HostApp;
6052a38012Sejakowatz 
6152a38012Sejakowatz 		void Reset();
6252a38012Sejakowatz 
6352a38012Sejakowatz virtual	~BSound();
6452a38012Sejakowatz 
6552a38012Sejakowatz 		void free_data();
6652a38012Sejakowatz static	status_t load_entry(void * arg);
6752a38012Sejakowatz 		void loader_thread();
6852a38012Sejakowatz 		bool check_stop();
6952a38012Sejakowatz 
7052a38012Sejakowatz public:
7152a38012Sejakowatz 
7252a38012Sejakowatz virtual	status_t BindTo(
7352a38012Sejakowatz 				BSoundPlayer * player,
7452a38012Sejakowatz 				const media_raw_audio_format & format);
7552a38012Sejakowatz virtual	status_t UnbindFrom(
7652a38012Sejakowatz 				BSoundPlayer * player);
7752a38012Sejakowatz 
7852a38012Sejakowatz private:
7952a38012Sejakowatz 		status_t _Reserved_Sound_0(void *);	//	BindTo
8052a38012Sejakowatz 		status_t _Reserved_Sound_1(void *);	//	UnbindFrom
8152a38012Sejakowatz virtual	status_t _Reserved_Sound_2(void *);
8252a38012Sejakowatz virtual	status_t _Reserved_Sound_3(void *);
8352a38012Sejakowatz virtual	status_t _Reserved_Sound_4(void *);
8452a38012Sejakowatz virtual	status_t _Reserved_Sound_5(void *);
8552a38012Sejakowatz 
8652a38012Sejakowatz 		void * _m_data;
8752a38012Sejakowatz 		BMediaFile * _m_file;
8852a38012Sejakowatz 		int32 _m_ref_count;
8952a38012Sejakowatz 		status_t _m_error;
9052a38012Sejakowatz 		size_t _m_size;
9152a38012Sejakowatz 		media_raw_audio_format _m_format;
9252a38012Sejakowatz 		bool _m_free_when_done;
9352a38012Sejakowatz 		bool _m_checkStopped;
9452a38012Sejakowatz 		bool _m_reserved[2];
9552a38012Sejakowatz 		area_id _m_area;
9652a38012Sejakowatz 		sem_id _m_avail_sem;
9752a38012Sejakowatz 		sem_id _m_free_sem;
9852a38012Sejakowatz 		thread_id _m_loader_thread;
9952a38012Sejakowatz 		size_t _m_read_pos;
10052a38012Sejakowatz 		sem_id _m_check_token;
10152a38012Sejakowatz 		int32 _m_prev_sem_count;
10252a38012Sejakowatz 
10352a38012Sejakowatz 		BSoundPlayer * _m_bound_player;
10452a38012Sejakowatz 		int32 _m_bind_flags;
10552a38012Sejakowatz 
10652a38012Sejakowatz 		BPrivate::BTrackReader * _m_trackReader;
10752a38012Sejakowatz 		char m_tname[32];
10852a38012Sejakowatz 		uint32 _reserved_[1];
10952a38012Sejakowatz 
11052a38012Sejakowatz };
11152a38012Sejakowatz 
11252a38012Sejakowatz 
11352a38012Sejakowatz #endif	/* _SOUND_H */
114