private void StartRunning() { m_selectedDevice.VideoFrameCompleted += new DeckLinkVideoOutputHandler((b) => this.BeginInvoke((Action)(() => { ScheduleNextFrame(b); }))); m_selectedDevice.AudioOutputRequested += new DeckLinkAudioOutputHandler(() => this.BeginInvoke((Action)(() => { WriteNextAudioSamples(); }))); m_selectedDevice.PlaybackStopped += new DeckLinkPlaybackStoppedHandler(() => this.BeginInvoke((Action)(() => { DisableOutput(); }))); m_outputSignal = ((StringObjectPair <OutputSignal>)comboBoxOutputSignal.SelectedItem).value; m_audioChannelCount = (uint)((int)comboBoxAudioChannels.SelectedItem); m_audioSampleDepth = ((StringObjectPair <_BMDAudioSampleType>)comboBoxAudioDepth.SelectedItem).value; m_audioSampleRate = _BMDAudioSampleRate.bmdAudioSampleRate48kHz; // //- Extract the IDeckLinkDisplayMode from the display mode popup menu m_frameWidth = m_selectedDisplayMode.GetWidth(); m_frameHeight = m_selectedDisplayMode.GetHeight(); m_selectedDisplayMode.GetFrameRate(out m_frameDuration, out m_frameTimescale); // Calculate the number of frames per second, rounded up to the nearest integer. For example, for NTSC (29.97 FPS), framesPerSecond == 30. m_framesPerSecond = (uint)((m_frameTimescale + (m_frameDuration - 1)) / m_frameDuration); // Set the video output mode m_selectedDevice.deckLinkOutput.EnableVideoOutput(m_selectedDisplayMode.GetDisplayMode(), _BMDVideoOutputFlags.bmdVideoOutputFlagDefault); // Set the audio output mode m_selectedDevice.deckLinkOutput.EnableAudioOutput(m_audioSampleRate, m_audioSampleDepth, m_audioChannelCount, _BMDAudioOutputStreamType.bmdAudioOutputStreamContinuous); // Set screen preview callback m_selectedDevice.deckLinkOutput.SetScreenPreviewCallback(previewWindow); // Generate one second of audio m_audioBufferSampleLength = (uint)((m_framesPerSecond * (uint)m_audioSampleRate * m_frameDuration) / m_frameTimescale); m_audioBuffer = Marshal.AllocCoTaskMem((int)(m_audioBufferSampleLength * m_audioChannelCount * ((uint)m_audioSampleDepth / 8))); // Zero the buffer (interpreted as audio silence) for (int i = 0; i < (m_audioBufferSampleLength * m_audioChannelCount * (uint)m_audioSampleDepth / 8); i++) { Marshal.WriteInt32(m_audioBuffer, i, 0); } uint audioSamplesPerFrame = (uint)(((uint)m_audioSampleRate * m_frameDuration) / m_frameTimescale); if (m_outputSignal == OutputSignal.kOutputSignalPip) { FillSine(m_audioBuffer, audioSamplesPerFrame, m_audioChannelCount, m_audioSampleDepth); } else { FillSine(new IntPtr(m_audioBuffer.ToInt64() + (audioSamplesPerFrame * m_audioChannelCount * (uint)m_audioSampleDepth / 8)), (m_audioBufferSampleLength - audioSamplesPerFrame), m_audioChannelCount, m_audioSampleDepth); } // Generate a frame of black m_videoFrameBlack = CreateOutputVideoFrame(FillBlack); // Generate a frame of colour bars m_videoFrameBars = CreateOutputVideoFrame(FillColourBars); // Begin video preroll by scheduling a second of frames in hardware m_totalFramesScheduled = 0; for (uint i = 0; i < m_framesPerSecond; i++) { ScheduleNextFrame(true); } // Begin audio preroll. This will begin calling our audio callback, which will start the DeckLink output stream. m_audioBufferOffset = 0; m_selectedDevice.deckLinkOutput.BeginAudioPreroll(); m_running = true; buttonStartStop.Text = "Stop"; }
public void LoadSignal(OutputSignal signal) { signal.transform.parent = signalHolder; signal.signalName = signal.inputPins[0].pinName; signals.Add(signal); }
private void StartRunning() { m_outputSignal = ((StringObjectPair <OutputSignal>)comboBoxOutputSignal.SelectedItem).value; m_audioChannelCount = uint.Parse((string)comboBoxAudioChannels.SelectedItem); m_audioSampleDepth = ((StringObjectPair <_BMDAudioSampleType>)comboBoxAudioDepth.SelectedItem).value; m_audioSampleRate = _BMDAudioSampleRate.bmdAudioSampleRate48kHz; // //- Extract the IDeckLinkDisplayMode from the display mode popup menu IDeckLinkDisplayMode videoDisplayMode; videoDisplayMode = ((DisplayModeEntry)comboBoxVideoFormat.SelectedItem).displayMode; m_frameWidth = videoDisplayMode.GetWidth(); m_frameHeight = videoDisplayMode.GetHeight(); videoDisplayMode.GetFrameRate(out m_frameDuration, out m_frameTimescale); // Calculate the number of frames per second, rounded up to the nearest integer. For example, for NTSC (29.97 FPS), framesPerSecond == 30. m_framesPerSecond = (uint)((m_frameTimescale + (m_frameDuration - 1)) / m_frameDuration); // Set the video output mode m_deckLinkOutput.EnableVideoOutput(videoDisplayMode.GetDisplayMode(), _BMDVideoOutputFlags.bmdVideoOutputFlagDefault); // Set the audio output mode m_deckLinkOutput.EnableAudioOutput(m_audioSampleRate, m_audioSampleDepth, m_audioChannelCount, _BMDAudioOutputStreamType.bmdAudioOutputStreamContinuous); // Generate one second of audio m_audioBufferSampleLength = (uint)((m_framesPerSecond * (uint)m_audioSampleRate * m_frameDuration) / m_frameTimescale); m_audioBuffer = Marshal.AllocCoTaskMem((int)(m_audioBufferSampleLength * m_audioChannelCount * ((uint)m_audioSampleDepth / 8))); // Zero the buffer (interpreted as audio silence) for (int i = 0; i < (m_audioBufferSampleLength * m_audioChannelCount * (uint)m_audioSampleDepth / 8); i++) { Marshal.WriteInt32(m_audioBuffer, i, 0); } uint audioSamplesPerFrame = (uint)(((uint)m_audioSampleRate * m_frameDuration) / m_frameTimescale); if (m_outputSignal == OutputSignal.kOutputSignalPip) { FillSine(m_audioBuffer, audioSamplesPerFrame, m_audioChannelCount, m_audioSampleDepth); } else { FillSine(new IntPtr(m_audioBuffer.ToInt64() + (audioSamplesPerFrame * m_audioChannelCount * (uint)m_audioSampleDepth / 8)), (m_audioBufferSampleLength - audioSamplesPerFrame), m_audioChannelCount, m_audioSampleDepth); } // Generate a frame of black m_deckLinkOutput.CreateVideoFrame(m_frameWidth, m_frameHeight, m_frameWidth * 2, _BMDPixelFormat.bmdFormat8BitYUV, _BMDFrameFlags.bmdFrameFlagDefault, out m_videoFrameBlack); FillBlack(m_videoFrameBlack); // Generate a frame of colour bars m_deckLinkOutput.CreateVideoFrame(m_frameWidth, m_frameHeight, m_frameWidth * 2, _BMDPixelFormat.bmdFormat8BitYUV, _BMDFrameFlags.bmdFrameFlagDefault, out m_videoFrameBars); FillColourBars(m_videoFrameBars); // Begin video preroll by scheduling a second of frames in hardware m_totalFramesScheduled = 0; for (uint i = 0; i < m_framesPerSecond; i++) { ScheduleNextFrame(true); } // Begin audio preroll. This will begin calling our audio callback, which will start the DeckLink output stream. m_audioBufferOffset = 0; m_deckLinkOutput.BeginAudioPreroll(); m_running = true; buttonStartStop.Text = "Stop"; }