void test_pcm_source(int op) { if (op == 0) { if (g_test_source == nullptr) { auto mydsp = std::make_shared<MyTestAudioDSP>(); g_test_source = std::make_shared<MRP_PCMSource>(mydsp); g_prev_reg.src = g_test_source.get(); g_prev_reg.volume = 1.0; g_prev_reg.loop = true; #ifdef WIN32 InitializeCriticalSection(&g_prev_reg.cs); #else // I wonder if pthread copies this stuff internally... pthread_mutexattr_t mta; pthread_mutexattr_init(&mta); pthread_mutexattr_settype(&mta, PTHREAD_MUTEX_RECURSIVE); pthread_mutex_init(&g_prev_reg.mutex, &mta); #endif } if (g_is_playing == false) { g_test_source->get_dsp()->prepare_audio(2, 44100.0, 512); PlayPreview(&g_prev_reg); g_is_playing = true; } else { StopPreview(&g_prev_reg); g_test_source->get_dsp()->release_audio(); g_is_playing = false; } } else if (op == 1) // Clean up on Reaper shutdown { if (g_is_playing == true) StopPreview(&g_prev_reg); g_test_source.reset(); #ifdef WIN32 DeleteCriticalSection(&g_prev_reg.cs); #else pthread_mutex_destroy(&g_prev_reg.mutex); #endif } }
HRESULT CGraphRender::StartPreview(const RECT& rect, HWND hWnd) { StopPreview(); HRESULT hr = PutIntoWindow( hWnd, rect, TRUE ); Run(); return hr; }
HRESULT CVideoCapture::StartPreview(const RECT& rect, HWND hWnd) { StopPreview(); CComPtr<IBaseFilter> pCapture; m_pGraphBuilder->FindFilterByName( L"Video Capture", &pCapture ); HRESULT hr = m_pCapGraphBuilder->RenderStream( &PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, pCapture, NULL, NULL ); if ( SUCCEEDED(hr) ) hr = PutIntoWindow( hWnd, rect, TRUE ); Run(); return hr; }
HRESULT CAccessSys::StartCapture(void) { HRESULT hr; IBaseFilter *pSrcFilter = NULL; IFilterGraph*pGraph = NULL; if (e_psCurrent == Running){ StopPreview(); } hr = BuildCapture(); if (FAILED(hr)) { Msg(TEXT("Couldn't BuildCapture ! hr=0x%x"), hr); return hr; } // Start previewing video & audio data if (h_wnd){ hr = SetupVideoWindow(h_wnd); if (FAILED(hr)) { Msg(TEXT("Couldn't initialize video window! hr=0x%x"), hr); return hr; } } hr = p_control->Run(); if (FAILED(hr)) { Msg(TEXT("Couldn't run the graph! hr=0x%x"), hr); return hr; } // Remember current state e_psCurrent = Running; //m_remote = new CRemoteSys(p_loop); //Msg(TEXT("StartCapture success")); return S_OK; }
void CPreviewCtrl::OnTimer(UINT nIDEvent) { if(m_nFrame < 0) { m_nFrame = 0; } else { m_nFrame++; } if(m_nFrame > m_nTotalFrames) { m_nFrame = 0; StopPreview(); } AfxTrace("OnTimer: m_nFrame=%d\n", m_nFrame); InvalidateRect(NULL, TRUE); CStatic::OnTimer(nIDEvent); }
HRESULT CVideoRenderer::StartPreview(const RECT& rect, HWND hWnd) { StopPreview(); CComPtr<IBaseFilter> pSmartTee; m_pGraphBuilder->FindFilterByName( L"Smart Tee", &pSmartTee ); // Compressor CComPtr<IBaseFilter> pCompressor; CreateFilter( CLSID_H263Decoder, L"H.263 Decoder", &pCompressor ); CComPtr<IPin> pPinOut; pSmartTee->FindPin( L"Preview", &pPinOut ); if ( SUCCEEDED( m_pGraphBuilder->Render( pPinOut ) ) ) { PutIntoWindow( hWnd, rect, TRUE ); } return Run(); }
HRESULT CAccessSys::StartPreview(HWND h) { HRESULT hr; IBaseFilter *pSrcFilter = NULL; if (e_psCurrent == Running){ StopPreview(); } hr = BuildPreview(); if (FAILED(hr)){ return hr; } //// Get DirectShow interfaces //hr = GetInterfaces(); //if (FAILED(hr)) //{ // Msg(TEXT("Failed to get video interfaces! hr=0x%x"), hr); // return hr; //} //// Attach the filter graph to the capture graph //hr = p_capture_graph_builder2->SetFiltergraph(p_graph); //if (FAILED(hr)) //{ // Msg(TEXT("Failed to set capture filter graph! hr=0x%x"), hr); // return hr; //} //// Use the system device enumerator and class enumerator to find //// a video capture/preview device, such as a desktop USB video camera. //hr = FindCaptureDevice(); //if (FAILED(hr)) //{ // // Don't display a message because FindCaptureDevice will handle it // return hr; //} //pSrcFilter = p_streams[0].p_device_filter; //// Add Capture filter to our graph. //hr = p_graph->AddFilter(pSrcFilter, L"Video Source"); //if (FAILED(hr)) //{ // Msg(TEXT("Couldn't add the capture filter to the graph! hr=0x%x\r\n\r\n") // TEXT("If you have a working video capture device, please make sure\r\n") // TEXT("that it is connected and is not being used by another application.\r\n\r\n") // TEXT("The sample will now close."), hr); // pSrcFilter->Release(); // return hr; //} // Render the preview pin on the video capture filter // Use this instead of g_pGraph->RenderFile //pSrcFilter = p_streams[0].p_device_filter; //hr = p_capture_graph_builder2->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, // pSrcFilter, NULL, NULL); //if (FAILED(hr)) //{ // Msg(TEXT("Couldn't render the video capture stream. hr=0x%x\r\n") // TEXT("The capture device may already be in use by another application.\r\n\r\n") // TEXT("The sample will now close."), hr); // pSrcFilter->Release(); // return hr; //} //// Now that the filter has been added to the graph and we have //// rendered its stream, we can release this reference to the filter. //pSrcFilter->Release(); //pSrcFilter = p_streams[1].p_device_filter; //// Add Capture filter to our graph. //hr = p_graph->AddFilter(pSrcFilter, L"Audio Source"); //if (FAILED(hr)) //{ // Msg(TEXT("Couldn't add the capture filter to the graph! hr=0x%x\r\n\r\n") // TEXT("If you have a working video capture device, please make sure\r\n") // TEXT("that it is connected and is not being used by another application.\r\n\r\n") // TEXT("The sample will now close."), hr); // pSrcFilter->Release(); // return hr; //} // Render the preview pin on the audio capture filter // Use this instead of g_pGraph->RenderFile //pSrcFilter = p_streams[1].p_device_filter; //hr = p_capture_graph_builder2->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Audio, // pSrcFilter, NULL, NULL); //if (FAILED(hr)) //{ // Msg(TEXT("Couldn't render the video capture stream. hr=0x%x\r\n") // TEXT("The capture device may already be in use by another application.\r\n\r\n") // TEXT("The sample will now close."), hr); // pSrcFilter->Release(); // return hr; //} //// Now that the filter has been added to the graph and we have //// rendered its stream, we can release this reference to the filter. //pSrcFilter->Release(); // Set video window style and position if (h){ h_wnd = h; hr = SetupVideoWindow(h_wnd); if (FAILED(hr)) { Msg(TEXT("Couldn't initialize video window! hr=0x%x"), hr); return hr; } } #ifdef REGISTER_FILTERGRAPH // Add our graph to the running object table, which will allow // the GraphEdit application to "spy" on our graph hr = AddGraphToRot(g_pGraph, &g_dwGraphRegister); if (FAILED(hr)) { Msg(TEXT("Failed to register filter graph with ROT! hr=0x%x"), hr); g_dwGraphRegister = 0; } #endif // Start previewing video & audio data hr = p_control->Run(); if (FAILED(hr)) { Msg(TEXT("Couldn't run the graph! hr=0x%x"), hr); return hr; } DWORD err = GetLastError(); // Remember current state e_psCurrent = Running; //ConnectToServer(m_userinfo.ip, m_userinfo.port); return S_OK; }
CAccessSys::~CAccessSys(void) { if (e_psCurrent == Running) StopPreview(); CloseInterfaces(); }
static void MidiTakePreview (int mode, MediaItem_Take* take, MediaTrack* track, double volume, double startOffset, double measureSync, bool pauseDuringPrev) { /* mode: 0 -> stop * * 1 -> start * * 2 -> toggle */ if (IsRecording()) // Reaper won't preview anything during recording but extension will still think preview is in progress (could disrupt toggle states and send unneeded CC123) return; if (g_itemPreviewPlaying) { if (g_ItemPreview.preview_track) { StopTrackPreview(&g_ItemPreview); SendAllNotesOff((MediaTrack*)g_ItemPreview.preview_track); } else { StopPreview(&g_ItemPreview); } g_itemPreviewPlaying = false; delete g_ItemPreview.src; if (g_itemPreviewPaused && mode != 1) // requesting new preview while old one is still playing shouldn't unpause playback { if (IsPaused()) OnPauseButton(); g_itemPreviewPaused = false; } if (mode == 2) return; } if (mode == 0) return; if (take) { MediaItem* item = GetMediaItemTake_Item(take); MediaItem_Take* oldTake = GetActiveTake(item); bool itemMuteState = *(bool*)GetSetMediaItemInfo(item, "B_MUTE", NULL); double effectiveTakeLen = EffectiveMidiTakeLength(take, true, true); GetSetMediaItemInfo(item, "B_MUTE", &g_bFalse); // needs to be set before getting the source SetActiveTake(take); // active item take and editor take may differ PCM_source* src = ((PCM_source*)item)->Duplicate(); // must be item source otherwise item/take volume won't get accounted for if (src && effectiveTakeLen > 0 && effectiveTakeLen > startOffset) { GetSetMediaItemInfo((MediaItem*)src, "D_POSITION", &g_d0); GetSetMediaItemInfo((MediaItem*)src, "D_LENGTH", &effectiveTakeLen); if (!g_ItemPreview.src) { #ifdef _WIN32 InitializeCriticalSection(&g_ItemPreview.cs); #else pthread_mutex_init(&g_ItemPreview.mutex, NULL); #endif g_ItemPreview.loop = false; } g_ItemPreview.src = src; g_ItemPreview.m_out_chan = (track) ? (-1) : (0); g_ItemPreview.curpos = startOffset; g_ItemPreview.volume = volume; g_ItemPreview.preview_track = track; // Pause before preview otherwise MidiTakePreviewPlayState will stop it g_itemPreviewPaused = pauseDuringPrev; if (g_itemPreviewPaused && IsPlaying() && !IsPaused()) OnPauseButton(); if (g_ItemPreview.preview_track) g_itemPreviewPlaying = !!PlayTrackPreview2Ex(NULL, &g_ItemPreview, (measureSync) ? (1) : (0), measureSync); else g_itemPreviewPlaying = !!PlayPreviewEx(&g_ItemPreview, (measureSync) ? (1) : (0), measureSync); if (g_itemPreviewPlaying) plugin_register("timer",(void*)MidiTakePreviewTimer); else delete g_ItemPreview.src; } SetActiveTake(oldTake); GetSetMediaItemInfo(item, "B_MUTE", &itemMuteState); } }
static void MidiTakePreview (int mode, MediaItem_Take* take, MediaTrack* track, double volume, double startOffset, double measureSync, bool pauseDuringPrev) { /* mode: 0 -> stop * * 1 -> start * * 2 -> toggle */ // First stop any ongoing preview RegisterCsurfPlayState(false, MidiTakePreviewPlayState); if (g_itemPreviewPlaying) { if (g_ItemPreview.preview_track) { StopTrackPreview(&g_ItemPreview); SendAllNotesOff((MediaTrack*)g_ItemPreview.preview_track); } else { StopPreview(&g_ItemPreview); } g_itemPreviewPlaying = false; plugin_register("-timer",(void*)MidiTakePreviewTimer); delete g_ItemPreview.src; if (g_itemPreviewPaused && mode != 1) // requesting new preview while old one is still playing shouldn't unpause playback { if (IsPaused(NULL)) OnPauseButtonEx(NULL); g_itemPreviewPaused = false; } // Toggled preview off...treat it as stop if (mode == 2) mode = 0; } // About IsRecording: REAPER won't preview anything during recording but extension will still think preview is in progress if we let it continue here if (mode == 0 || IsRecording(NULL)) return; if (take) { PreventUIRefresh(1); // item may get resized temporarily so hide it from the user MediaItem* item = GetMediaItemTake_Item(take); MediaItem_Take* oldTake = GetActiveTake(item); bool itemMuteState = *(bool*)GetSetMediaItemInfo(item, "B_MUTE", NULL); GetSetMediaItemInfo(item, "B_MUTE", &g_bFalse); // needs to be set before getting the source SetActiveTake(take); // active item take and editor take may differ // If timebase in MIDI editor is set to Beats (source), make sure item is croped so full MIDI source is visible beforing getting the source double itemStart = -1; double itemEnd = -1; double takeOffset = 0; double itemPositionOffset = 0; if (GetToggleCommandState2(SectionFromUniqueID(SECTION_MIDI_EDITOR), 40470) > 0) // Timebase: Beats(source) { itemStart = GetMediaItemInfo_Value(item, "D_POSITION"); itemEnd = itemStart + GetMediaItemInfo_Value(item, "D_LENGTH"); takeOffset = GetMediaItemTakeInfo_Value(take, "D_STARTOFFS"); double sourceLenPPQ = GetMidiSourceLengthPPQ(take, NULL); if (takeOffset != 0) SetMediaItemTakeInfo_Value(take, "D_STARTOFFS", 0); double itemSourceStart = MIDI_GetProjTimeFromPPQPos(take, 0); if (itemSourceStart < 0) { itemPositionOffset = abs(itemSourceStart); SetMediaItemInfo_Value(item, "D_POSITION", itemStart + itemPositionOffset); itemSourceStart = MIDI_GetProjTimeFromPPQPos(take, 0); } SetMediaItemInfo_Value(item, "D_POSITION", itemSourceStart); SetMediaItemInfo_Value(item, "D_LENGTH", MIDI_GetProjTimeFromPPQPos(take, sourceLenPPQ) - itemSourceStart); } double effectiveTakeLen = EffectiveMidiTakeEnd(take, true, true, true) - GetMediaItemInfo_Value(item, "D_POSITION"); PCM_source* src = DuplicateSource((PCM_source*)item); // must be item source otherwise item/take volume won't get accounted for if (src && effectiveTakeLen > 0) { GetSetMediaItemInfo((MediaItem*)src, "D_POSITION", &g_d0); GetSetMediaItemInfo((MediaItem*)src, "D_LENGTH", &effectiveTakeLen); if (!g_ItemPreview.src) { #ifdef _WIN32 InitializeCriticalSection(&g_ItemPreview.cs); #else pthread_mutex_init(&g_ItemPreview.mutex, NULL); #endif g_ItemPreview.loop = false; } g_ItemPreview.src = src; g_ItemPreview.m_out_chan = (track) ? (-1) : (0); g_ItemPreview.curpos = startOffset; g_ItemPreview.volume = volume; g_ItemPreview.preview_track = track; // Pause before preview otherwise MidiTakePreviewPlayState will stop it g_itemPreviewPaused = pauseDuringPrev; if (g_itemPreviewPaused && IsPlaying(NULL) && !IsPaused(NULL)) OnPauseButton(); if (g_ItemPreview.preview_track) g_itemPreviewPlaying = !!PlayTrackPreview2Ex(NULL, &g_ItemPreview, 1, measureSync); else g_itemPreviewPlaying = !!PlayPreviewEx(&g_ItemPreview, 1, measureSync); if (g_itemPreviewPlaying) { plugin_register("timer",(void*)MidiTakePreviewTimer); RegisterCsurfPlayState(true, MidiTakePreviewPlayState); } else delete g_ItemPreview.src; } if (itemStart != -1) { SetMediaItemInfo_Value(item, "D_POSITION", itemStart + itemPositionOffset); SetMediaItemInfo_Value(item, "D_LENGTH", itemEnd - itemStart); if (itemPositionOffset != 0) SetMediaItemInfo_Value(item, "D_POSITION", itemStart); if (takeOffset != 0) SetMediaItemTakeInfo_Value(take, "D_STARTOFFS", takeOffset); } SetActiveTake(oldTake); GetSetMediaItemInfo(item, "B_MUTE", &itemMuteState); PreventUIRefresh(-1); } }