Пример #1
0
        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
        }
Пример #2
0
        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;
            }
        }
Пример #3
0
        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);
                }
            }
        }
Пример #4
0
        //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);
        }
Пример #5
0
    // 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++;
    }
Пример #6
0
        // 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
        }
Пример #7
0
 // delegate method called by streamToCache
 void RecAtEnd( GATData[] caches, bool willLoop )
 {
     _recState = RecState.Idle;
 }
Пример #8
0
        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();
        }
Пример #9
0
        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();
        }
Пример #10
0
 void RecAtEnd(GATData[] caches, bool willLoop)           // delegate method called by streamToCache
 {
     _recState = RecState.Idle;
 }