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