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