RecorderWindow.h revision 948356de
1/*
2 * Copyright 2005, J��r��me Duval. All rights reserved.
3 * Distributed under the terms of the MIT License.
4 *
5 * Inspired by SoundCapture from Be newsletter (Media Kit Basics: Consumers and Producers)
6 */
7
8#ifndef RECORDERWINDOW_H
9#define RECORDERWINDOW_H
10
11#include <Directory.h>
12#include <Entry.h>
13#include <File.h>
14#include <FilePanel.h>
15#include <MediaFile.h>
16#include <MediaNode.h>
17#include <MediaTrack.h>
18#include <SoundPlayer.h>
19#include <Window.h>
20
21#include "DrawButton.h"
22#include "ScopeView.h"
23#include "TransportButton.h"
24#include "TrackSlider.h"
25#include "UpDownButton.h"
26#include "VolumeSlider.h"
27#include "VUView.h"
28
29class BMediaRoster;
30class BBox;
31class BButton;
32class BCheckBox;
33class BTextControl;
34class BMenuField;
35class SoundConsumer;
36class SoundListView;
37class BScrollView;
38class BSlider;
39class BStringView;
40
41class RecorderWindow : public BWindow {
42public:
43		RecorderWindow();
44	virtual	~RecorderWindow();
45		status_t InitCheck();
46
47
48	virtual	bool QuitRequested();
49	virtual	void MessageReceived(BMessage * message);
50
51		enum {
52			RECORD = 'cw00',			//	command messages
53			PLAY,
54			STOP,
55			REWIND,
56			FORWARD,
57			SAVE,
58			VIEW_LIST,
59			LOOP,
60			INPUT_SELECTED = 'cW00',	//	control messages
61			LENGTH_CHANGED,
62			SOUND_SELECTED,
63			STOP_PLAYING,
64			STOP_RECORDING,
65			RECORD_PERIOD,
66			PLAY_PERIOD,
67			UPDATE_TRACKSLIDER,
68			POSITION_CHANGED
69		};
70
71		void AddSoundItem(const BEntry& entry, bool temp = false);
72
73private:
74		BMediaRoster * fRoster;
75		VUView *fVUView;
76		ScopeView *fScopeView;
77		RecordButton * fRecordButton;
78		PlayPauseButton * fPlayButton;
79		TransportButton * fStopButton;
80		TransportButton * fRewindButton;
81		TransportButton * fForwardButton;
82		TransportButton * fSaveButton;
83		DrawButton * fLoopButton;
84		VolumeSlider *fVolumeSlider;
85		TrackSlider *fTrackSlider;
86		UpDownButton * fUpDownButton;
87		BTextControl * fLengthControl;
88		BMenuField * fInputField;
89		SoundConsumer * fRecordNode;
90		BSoundPlayer * fPlayer;
91		bool fRecording;
92		SoundListView * fSoundList;
93		BDirectory fTempDir;
94		int fTempCount;
95
96		BBox * fBottomBox;
97		BBox * fFileInfoBox;
98		BStringView *fFilename;
99		BStringView *fFormat;
100		BStringView *fCompression;
101		BStringView *fChannels;
102		BStringView *fSampleSize;
103		BStringView *fSampleRate;
104		BStringView *fDuration;
105
106		enum BtnState {
107			btnPaused,
108			btnRecording,
109			btnPlaying
110		};
111		BtnState fButtonState;
112		BEntry fRecEntry;
113
114		BFile fRecFile;
115		off_t fRecLimit;
116		off_t fRecSize;
117
118		media_node fAudioInputNode;
119		media_output fAudioOutput;
120		media_input fRecInput;
121
122		BMediaFile *fPlayFile;
123		media_format fPlayFormat;
124		BMediaTrack *fPlayTrack;
125		int64 fPlayLimit;
126		int64 fPlayFrame;
127		int64 fPlayFrames;
128
129		bool fLooping;
130
131		media_node fAudioMixerNode;
132
133		BFilePanel *fSavePanel;
134		status_t fInitCheck;
135
136		status_t InitWindow();
137
138		void Record(BMessage * message);
139		void Play(BMessage * message);
140		void Stop(BMessage * message);
141		void Save(BMessage * message);
142		void DoSave(BMessage * message);
143		void Input(BMessage * message);
144		void Length(BMessage * message);
145		void Selected(BMessage * message);
146
147		status_t MakeRecordConnection(const media_node & input);
148		status_t BreakRecordConnection();
149		status_t StopRecording();
150
151		status_t MakePlayConnection(const media_multi_audio_format & format);
152		status_t BreakPlayConnection();
153		status_t StopPlaying();
154
155		status_t NewTempName(char * buffer);
156		void CalcSizes(float min_width, float min_height);
157		void SetButtonState(BtnState state);
158		void UpdateButtons();
159		void UpdatePlayFile();
160		void ErrorAlert(const char * action, status_t err);
161
162static	void RecordFile(void * cookie, bigtime_t timestamp, void * data, size_t size, const media_raw_audio_format & format);
163static	void NotifyRecordFile(void * cookie, int32 code, ...);
164
165static	void PlayFile(void * cookie, void * data, size_t size, const media_raw_audio_format & format);
166static	void NotifyPlayFile(void * cookie, BSoundPlayer::sound_player_notification code, ...);
167
168		void RefsReceived(BMessage *msg);
169};
170
171#endif	/*	RECORDERWINDOW_H */
172
173