xref: /haiku/src/apps/soundrecorder/RecorderWindow.h (revision 4f2fd49bdc6078128b1391191e4edac647044c3d)
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 "SoundListView.h"
24 #include "TransportButton.h"
25 #include "TrackSlider.h"
26 #include "UpDownButton.h"
27 #include "VolumeSlider.h"
28 #include "VUView.h"
29 
30 class BMediaRoster;
31 class BBox;
32 class BButton;
33 class BCheckBox;
34 class BMenuField;
35 class SoundConsumer;
36 class SoundListView;
37 class BScrollView;
38 class BSlider;
39 class BStringView;
40 
41 class RecorderWindow : public BWindow {
42 public:
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 			SOUND_SELECTED,
62 			STOP_PLAYING,
63 			STOP_RECORDING,
64 			RECORD_PERIOD,
65 			PLAY_PERIOD,
66 			UPDATE_TRACKSLIDER,
67 			POSITION_CHANGED
68 		};
69 
70 		void AddSoundItem(const BEntry& entry, bool temp = false);
71 		void RemoveCurrentSoundItem();
72 
73 private:
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 		BMenuField * fInputField;
88 		SoundConsumer * fRecordNode;
89 		BSoundPlayer * fPlayer;
90 		bool fRecording;
91 		SoundListView * fSoundList;
92 		BDirectory fTempDir;
93 		int fTempCount;
94 
95 		BBox * fBottomBox;
96 		BBox * fFileInfoBox;
97 		BStringView *fFilename;
98 		BStringView *fFormat;
99 		BStringView *fCompression;
100 		BStringView *fChannels;
101 		BStringView *fSampleSize;
102 		BStringView *fSampleRate;
103 		BStringView *fDuration;
104 
105 		enum BtnState {
106 			btnPaused,
107 			btnRecording,
108 			btnPlaying
109 		};
110 		BtnState fButtonState;
111 		BEntry fRecEntry;
112 
113 		media_format fRecordFormat;
114 
115 		BFile fRecFile;
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 		status_t UpdatePlayFile(SoundListItem *item, bool updateDisplay = false);
160 		void ErrorAlert(const char * action, status_t err);
161 
162 static	void RecordFile(void * cookie, bigtime_t timestamp, void * data, size_t size, const media_raw_audio_format & format);
163 static	void NotifyRecordFile(void * cookie, int32 code, ...);
164 
165 static	void PlayFile(void * cookie, void * data, size_t size, const media_raw_audio_format & format);
166 static	void NotifyPlayFile(void * cookie, BSoundPlayer::sound_player_notification code, ...);
167 
168 		void RefsReceived(BMessage *msg);
169 		void CopyTarget(BMessage *msg);
170 };
171 
172 #endif	/*	RECORDERWINDOW_H */
173 
174