public override void OnPulse(IGATPulseInfo pulseInfo) // Monitor pulse to handle recording and playback in time { if (pulseInfo.StepIndex == 0) // We're about to start the loop { int i; for (i = 0; i < _recs.Length; i++) { if (_recs[i].shouldPlay) // if there's some recorded data, play it { if (!streamToCache.Overdub && _recState == RecState.WillRec && _currentRecIndex == i) // but don't if we are recording this very track, except when overdubbing { continue; } _recs[i].Play(pulseInfo.PulseDspTime); // Play the cached data } } // If the user clicked record, we set the appropriate cache in the streamToCache module and fire if (_recState == RecState.WillRec) { streamToCache.Caches = _recs[_currentRecIndex].data; streamToCache.StartCaching(pulseInfo.PulseDspTime, RecAtEnd); // RecAtEnd will be called when the cache is full _recState = RecState.InRec; _recs[_currentRecIndex].shouldPlay = true; // next time setp 0 pulses, we'll have data that we should play } } _lastPulseIndex = pulseInfo.StepIndex; // store the pulse index for a rec count down }
public static void ChangeState(this Label label, RecState state) { switch (state) { case RecState.NOT_INITIATED: // [+] Default label.BackColor = Color.Yellow; label.ForeColor = Color.Black; label.Text = "Неактивний"; break; case RecState.PENDING: // TimerController.Start label.BackColor = Color.LightGreen; label.ForeColor = Color.Black; label.Text = "Очікування"; break; case RecState.RECORDING: // [+] RecController.Start label.BackColor = Color.Green; label.ForeColor = Color.White; label.Text = "Активний"; break; case RecState.FINISHED: // [+] RecController.Stop label.BackColor = Color.LightGreen; label.ForeColor = Color.Black; label.Text = "Закінчено"; break; case RecState.STOPPED: // Button : Stop label.BackColor = Color.Red; label.ForeColor = Color.White; label.Text = "Зупинено"; break; } }
private void HandleClientAsyncRec(IAsyncResult res) { RecState state = (RecState)res.AsyncState; TcpClient client = state.Client; byte[] oldbuff = state.Buffer; NetworkStream ns = state.Stream; if (client == null || !client.Connected) { return; } int b2r; try { b2r = ns.EndRead(res); } catch (System.IO.IOException) { return; } if (client.Available > 0) { throw new Exception("Data too long!"); } else { byte[] rt = new byte[b2r]; Array.Copy(oldbuff, rt, b2r); if (CloseAfterRec) { ns.Close(); client.Close(); } else { ns.BeginRead(state.Buffer, 0, state.Buffer.Length, HandleClientAsyncRec, state); } if (OnDataReceived != null) { OnDataReceived(client, rt); } } }
//internal class SendState //{ // public TcpListener Client; // public NetworkStream Stream; // public byte[] Buffer; //} private void HandleAsyncConnection(IAsyncResult res) { if (_Listener == null || _Listener.Server == null || _Listener.Server.IsBound == false) { return; } _Listener.BeginAcceptTcpClient(HandleAsyncConnection, _Listener); TcpClient client = _Listener.EndAcceptTcpClient(res); client.ReceiveTimeout = 10000; byte[] buff = new byte[client.Client.ReceiveBufferSize]; NetworkStream ns = client.GetStream(); ns.ReadTimeout = 10000; RecState state = new RecState { Client = client, Buffer = buff, Stream = ns }; ns.BeginRead(buff, 0, buff.Length, HandleClientAsyncRec, state); }
// Poll recorder objects at regular intervals void FixedUpdate() { if (_stopped) { return; } if (mode == Mode.Record) { if (_ticCount % _fixedFrameInterval == 0) { RecFrame frame = new RecFrame(); frame.time = Time.unscaledTime; // Fill out the recording frame // States represent the state of a given object at each frame foreach (Recorder rec in _objects) { RecState objectState = new RecState(rec); frame.states.Add(objectState); } // Arbitrary strings can be logged by other systems while (_messages.Count > 0) { frame.messages.Add(_messages.Dequeue()); } _recording.frames.Add(frame); } } else if (mode == Mode.Playback) { if (_ticCount % _recording.interval == 0) { if (_playbackFrame >= _recording.frames.Count) { //Debug.LogWarning("Recording over!"); } else { RecFrame frame = _recording.frames[_playbackFrame]; if (_playMode == PlayMode.Play) { Step(_playSpeed); } else if (_playMode == PlayMode.Reverse) { Step(-_playSpeed); } foreach (RecState state in frame.states) { // Get the object to update using the stored instance ID Recorder obj; CustomPlayback player; if (_playbackMapping.TryGetValue(state.obj_id, out player)) { state.Unpack(player); } else if (_objectMapping.TryGetValue(state.obj_id, out obj)) { state.Unpack(obj); } } // Playback messages foreach (string message in frame.messages) { Debug.LogFormat("RECORDING> {0}", message); } } } } _ticCount++; }
// Monitor pulse to handle recording and playback in time public override void OnPulse( IGATPulseInfo pulseInfo ) { if( pulseInfo.StepIndex == 0 ) // We're about to start the loop { int i; for( i = 0; i < _recs.Length; i++ ) { if( _recs[ i ].shouldPlay ) // if there's some recorded data, play it { if( !streamToCache.Overdub && _recState == RecState.WillRec && _currentRecIndex == i ) // but don't if we are recording this very track, except when overdubbing continue; _recs[ i ].Play( pulseInfo.PulseDspTime ); // Play the cached data } } // If the user clicked record, we set the appropriate cache in the streamToCache module and fire if( _recState == RecState.WillRec ) { streamToCache.Caches = _recs[ _currentRecIndex ].data; streamToCache.StartCaching( pulseInfo.PulseDspTime, RecAtEnd ); // RecAtEnd will be called when the cache is full _recState = RecState.InRec; _recs[ _currentRecIndex ].shouldPlay = true; // next time setp 0 pulses, we'll have data that we should play } } _lastPulseIndex = pulseInfo.StepIndex; // store the pulse index for a rec count down }
// delegate method called by streamToCache void RecAtEnd( GATData[] caches, bool willLoop ) { _recState = RecState.Idle; }
void OnGUI() { GUILayout.BeginArea( AREA ); GUILayout.Label( "G-Audio I/O examples: Looper" ); GUILayout.Label( "www.G-Audio-Unity.com" ); if( _recState == RecState.InRec ) GUI.enabled = false; GUILayout.Label( "Warning! Live mic, plug headphones or bear the larsen." ); _micMode = ( MicMode )GUILayout.SelectionGrid( ( int )_micMode, __micModes, 3 ); if( GUI.changed ) { switch( _micMode ) { case MicMode.Muted: mic.playThrough = false; streamToTrack.enabled = false; break; case MicMode.PlayThrough: mic.playThrough = true; streamToTrack.enabled = false; break; case MicMode.Track: mic.playThrough = false; streamToTrack.enabled = true; streamToTrack.TargetTrack = _currentTrack; break; } GUI.changed = false; } GUILayout.Space( 5f ); streamToCache.Overdub = GUILayout.Toggle( streamToCache.Overdub, "Overdub" ); GUILayout.Space( 5f ); metronomePattern.enabled = GUILayout.Toggle( metronomePattern.enabled, "Metronome" ); GUILayout.Space( 5f ); if( _recState == RecState.Idle ) { if( GUILayout.Button( "Rec", GUILayout.Width( 310f ) ) && _recState != RecState.InRec ) { _recState = RecState.WillRec; } } else if( _recState == RecState.WillRec ) { GUILayout.Button( ( 4 - _lastPulseIndex ).ToString(), GUILayout.Width( 310f ) ); } else { GUILayout.Button( "Recording", GUILayout.Width( 310f ) ); } GUILayout.Space( 5f ); GUI.changed = false; _currentRecIndex = GUILayout.SelectionGrid( _currentRecIndex, __trackSelection, _numTracks ); if( GUI.changed ) { UpdateCurrentTrack(); } GUILayout.Space( 10f ); GUILayout.Label( "Track Gain: "+_currentTrack.StereoGain.ToString( "0.00" ) ); _currentTrack.StereoGain = GUILayout.HorizontalSlider( _currentTrack.StereoGain, 0f, 2f ); GUILayout.Space( 5f ); GUILayout.Label( "Track Pan " ); _currentTrack.StereoPan = GUILayout.HorizontalSlider( _currentTrack.StereoPan, 0f, 1f ); GUILayout.Space( 10f ); if( GUILayout.Button( "Clear Track" ) ) { _recs[ _currentRecIndex ].data[ 0 ].Clear(); _recs[ _currentRecIndex ].shouldPlay = false; } GUILayout.Space( 10f ); #if UNITY_WEBPLAYER GUI.enabled = false; #endif if( streamToWav.IsWriting == false ) { if( GUILayout.Button( "Start recording to wav" ) ) { streamToWav.StartWriting(); } } else { if( GUILayout.Button( "Stop recording to wav" ) ) { streamToWav.EndWriting(); } } #if UNITY_WEBPLAYER GUILayout.Label( "Recording to disk is disabled in WebPlayers." ); #endif GUILayout.EndArea(); GUI.enabled = true; GUILayout.BeginArea( FILTER_AREA ); GUILayout.Label( "Track " + _recs[ _currentRecIndex ].trackNb + " Filter " ); if( _selectedFilter != null ) { int i; GUILayout.Space( 10f ); GUILayout.Label( _filterName ); GUILayout.Space( 10f ); AGATFilter.FilterProperty prop; for( i = 0; i < _trackFilterProps.Length; i++ ) { prop = _trackFilterProps[ i ]; if( prop.IsGroupToggle ) continue; GUILayout.BeginHorizontal(); GUILayout.Label( prop.LabelString, GUILayout.Width( 100f ) ); prop.SetValue( GUILayout.HorizontalSlider( prop.CurrentValue, prop.Range.Min, prop.Range.Max, GUILayout.Width( 200f ) ) ); GUILayout.EndHorizontal(); } _selectedFilter.Bypass = GUILayout.Toggle( _selectedFilter.Bypass, "Bypass Filter" ); } GUILayout.EndArea(); }
void OnGUI() { GUILayout.BeginArea(AREA); GUILayout.Label("G-Audio I/O examples: Looper"); GUILayout.Label("www.G-Audio-Unity.com"); if (_recState == RecState.InRec) { GUI.enabled = false; } GUILayout.Label("Warning! Live mic, plug headphones or bear the larsen."); _micMode = ( MicMode )GUILayout.SelectionGrid(( int )_micMode, __micModes, 3); if (GUI.changed) { switch (_micMode) { case MicMode.Muted: mic.playThrough = false; streamToTrack.enabled = false; break; case MicMode.PlayThrough: mic.playThrough = true; streamToTrack.enabled = false; break; case MicMode.Track: mic.playThrough = false; streamToTrack.enabled = true; streamToTrack.TargetTrack = _currentTrack; break; } GUI.changed = false; } GUILayout.Space(5f); streamToCache.Overdub = GUILayout.Toggle(streamToCache.Overdub, "Overdub"); GUILayout.Space(5f); metronomePattern.enabled = GUILayout.Toggle(metronomePattern.enabled, "Metronome"); GUILayout.Space(5f); if (_recState == RecState.Idle) { if (GUILayout.Button("Rec", GUILayout.Width(310f)) && _recState != RecState.InRec) { _recState = RecState.WillRec; } } else if (_recState == RecState.WillRec) { GUILayout.Button((4 - _lastPulseIndex).ToString(), GUILayout.Width(310f)); } else { GUILayout.Button("Recording", GUILayout.Width(310f)); } GUILayout.Space(5f); GUI.changed = false; _currentRecIndex = GUILayout.SelectionGrid(_currentRecIndex, __trackSelection, _numTracks); if (GUI.changed) { UpdateCurrentTrack(); } GUILayout.Space(10f); GUILayout.Label("Track Gain: " + _currentTrack.StereoGain.ToString("0.00")); _currentTrack.StereoGain = GUILayout.HorizontalSlider(_currentTrack.StereoGain, 0f, 2f); GUILayout.Space(5f); GUILayout.Label("Track Pan "); _currentTrack.StereoPan = GUILayout.HorizontalSlider(_currentTrack.StereoPan, 0f, 1f); GUILayout.Space(10f); if (GUILayout.Button("Clear Track")) { _recs[_currentRecIndex].data[0].Clear(); _recs[_currentRecIndex].shouldPlay = false; } GUILayout.Space(10f); #if UNITY_WEBPLAYER GUI.enabled = false; #endif if (streamToWav.IsWriting == false) { if (GUILayout.Button("Start recording to wav")) { streamToWav.StartWriting(); } } else { if (GUILayout.Button("Stop recording to wav")) { streamToWav.EndWriting(); } } #if UNITY_WEBPLAYER GUILayout.Label("Recording to disk is disabled in WebPlayers."); #endif GUILayout.EndArea(); GUI.enabled = true; GUILayout.BeginArea(FILTER_AREA); GUILayout.Label("Track " + _recs[_currentRecIndex].trackNb + " Filter "); if (_selectedFilter != null) { int i; GUILayout.Space(10f); GUILayout.Label(_filterName); GUILayout.Space(10f); AGATFilter.FilterProperty prop; for (i = 0; i < _trackFilterProps.Length; i++) { prop = _trackFilterProps[i]; if (prop.IsGroupToggle) { continue; } GUILayout.BeginHorizontal(); GUILayout.Label(prop.LabelString, GUILayout.Width(100f)); prop.SetValue(GUILayout.HorizontalSlider(prop.CurrentValue, prop.Range.Min, prop.Range.Max, GUILayout.Width(200f))); GUILayout.EndHorizontal(); } _selectedFilter.Bypass = GUILayout.Toggle(_selectedFilter.Bypass, "Bypass Filter"); } GUILayout.EndArea(); }
void RecAtEnd(GATData[] caches, bool willLoop) // delegate method called by streamToCache { _recState = RecState.Idle; }