From 18d948ef97924362f106511b9af3e60062c1963e Mon Sep 17 00:00:00 2001 From: Rodrigo Braz Monteiro Date: Sat, 25 Feb 2006 07:41:18 +0000 Subject: [PATCH] Finished separation of audio provider and player Originally committed to SVN as r171. --- core/audio_box.cpp | 6 ++-- core/audio_display.cpp | 61 +++++++++++++++++++++-------------- core/audio_display.h | 6 +++- core/audio_player.cpp | 20 +++++++++++- core/audio_player.h | 5 +++ core/audio_player_portaudio.h | 7 ++-- core/audio_provider.cpp | 15 +++++++-- core/audio_provider.h | 4 +-- core/audio_provider_avs.cpp | 3 -- core/video_display.cpp | 4 +-- 10 files changed, 89 insertions(+), 42 deletions(-) diff --git a/core/audio_box.cpp b/core/audio_box.cpp index a14643116..c6b8e983b 100644 --- a/core/audio_box.cpp +++ b/core/audio_box.cpp @@ -283,7 +283,7 @@ void AudioBox::OnVerticalZoom(wxScrollEvent &event) { float value = pow(float(pos)/50.0f,3); audioDisplay->SetScale(value); if (VerticalLink->GetValue()) { - audioDisplay->provider->SetVolume(value); + audioDisplay->player->SetVolume(value); VolumeBar->SetValue(pos); } } @@ -296,7 +296,7 @@ void AudioBox::OnVolume(wxScrollEvent &event) { int pos = event.GetPosition(); if (pos < 1) pos = 1; if (pos > 100) pos = 100; - audioDisplay->provider->SetVolume(pow(float(pos)/50.0f,3)); + audioDisplay->player->SetVolume(pow(float(pos)/50.0f,3)); } } @@ -309,7 +309,7 @@ void AudioBox::OnVerticalLink(wxCommandEvent &event) { if (pos > 100) pos = 100; float value = pow(float(pos)/50.0f,3); if (VerticalLink->GetValue()) { - audioDisplay->provider->SetVolume(value); + audioDisplay->player->SetVolume(value); VolumeBar->SetValue(pos); } VolumeBar->Enable(!VerticalLink->GetValue()); diff --git a/core/audio_display.cpp b/core/audio_display.cpp index 221f687a1..09eec6442 100644 --- a/core/audio_display.cpp +++ b/core/audio_display.cpp @@ -79,6 +79,7 @@ AudioDisplay::AudioDisplay(wxWindow *parent,VideoDisplay *display) oldCurPos = 0; scale = 1.0f; provider = NULL; + player = NULL; video = display; hold = 0; hasFocus = (wxWindow::FindFocus() == this); @@ -99,11 +100,13 @@ AudioDisplay::AudioDisplay(wxWindow *parent,VideoDisplay *display) ////////////// // Destructor AudioDisplay::~AudioDisplay() { - if (provider) delete provider; - if (origImage) delete origImage; - if (spectrumDisplay) delete spectrumDisplay; - if (peak) delete peak; - if (min) delete min; + if (player) player->CloseStream(); + delete provider; + delete player; + delete origImage; + delete spectrumDisplay; + delete peak; + delete min; } @@ -740,20 +743,30 @@ void AudioDisplay::SetScale(float _scale) { ////////////////// // Load from file void AudioDisplay::SetFile(wxString file) { + // Unload if (file.IsEmpty()) { - if (provider) - delete provider; + if (player) player->CloseStream(); + delete provider; + delete player; provider = NULL; + player = NULL; Reset(); loaded = false; } + + // Load else { SetFile(_T("")); try { - //provider = new AudioProvider(file, this); + // Get provider provider = AudioProvider::GetAudioProvider(file, this); + // Get player + player = AudioPlayer::GetAudioPlayer(); + player->SetDisplayTimer(&UpdateTimer); + player->SetProvider(provider); + player->OpenStream(); loaded = true; // Add to recent @@ -860,16 +873,16 @@ void AudioDisplay::Play(int start,int end) { if (end < start) end = start; // Call play - provider->Play(start,end-start); + player->Play(start,end-start); } //////// // Stop void AudioDisplay::Stop() { - if (!provider) return; + if (!player) return; - provider->Stop(); + player->Stop(); } @@ -1122,7 +1135,7 @@ void AudioDisplay::OnMouseEvent(wxMouseEvent& event) { } // Cursor drawing - if (!provider->IsPlaying()) { + if (!player->IsPlaying()) { // Draw bg wxClientDC dc(this); dc.BeginDrawing(); @@ -1186,7 +1199,7 @@ void AudioDisplay::OnMouseEvent(wxMouseEvent& event) { if (syl != -1) { int start = karaoke->syllables.at(syl).position * 10 + dialogue->Start.GetMS(); int count = karaoke->syllables.at(syl).length * 10; - provider->Play(GetSampleAtMS(start),GetSampleAtMS(count)); + player->Play(GetSampleAtMS(start),GetSampleAtMS(count)); } } } @@ -1207,7 +1220,7 @@ void AudioDisplay::OnMouseEvent(wxMouseEvent& event) { if (event.ButtonDown(wxMOUSE_BTN_RIGHT)) { curEndMS = GetMSAtX(x); mod = true; - provider->SetEndPosition(GetSampleAtX(x)); + player->SetEndPosition(GetSampleAtX(x)); } // Modified, commit changes @@ -1382,7 +1395,7 @@ void AudioDisplay::OnMouseEvent(wxMouseEvent& event) { // Update stuff if (updated) { - provider->SetEndPosition(GetSampleAtX(selEnd)); + player->SetEndPosition(GetSampleAtX(selEnd)); wxCursor cursor(wxCURSOR_SIZEWE); SetCursor(cursor); UpdateImage(true); @@ -1450,12 +1463,12 @@ void AudioDisplay::OnSize(wxSizeEvent &event) { // Timer event void AudioDisplay::OnUpdateTimer(wxTimerEvent &event) { // Get lock and check if it's OK - if (provider->GetMutex()) { - wxMutexLocker locker(*provider->GetMutex()); + if (player->GetMutex()) { + wxMutexLocker locker(*player->GetMutex()); if (!locker.IsOk()) return; } - if (!provider->IsPlaying()) return; + if (!player->IsPlaying()) return; // Get DCs //wxMutexGuiEnter(); @@ -1469,14 +1482,14 @@ void AudioDisplay::OnUpdateTimer(wxTimerEvent &event) { // Draw cursor int curpos = -1; - if (provider->IsPlaying()) { - if (provider->GetCurrentPosition() > provider->GetStartPosition() && provider->GetCurrentPosition() < provider->GetEndPosition()) { + if (player->IsPlaying()) { + if (player->GetCurrentPosition() > player->GetStartPosition() && player->GetCurrentPosition() < player->GetEndPosition()) { dc.SetPen(wxPen(Options.AsColour(_T("Audio Play cursor")))); - curpos = GetXAtSample(provider->GetCurrentPosition()); + curpos = GetXAtSample(player->GetCurrentPosition()); dc.DrawLine(curpos,0,curpos,h); } - else if (provider->GetCurrentPosition() > provider->GetEndPosition() + 8192) { - provider->Stop(); + else if (player->GetCurrentPosition() > player->GetEndPosition() + 8192) { + player->Stop(); } } oldCurPos = curpos; @@ -1521,7 +1534,7 @@ void AudioDisplay::OnKeyDown(wxKeyEvent &event) { // Play if (Hotkeys.IsPressed(_T("Audio Play")) || Hotkeys.IsPressed(_T("Audio Play Alt"))) { - if (provider->IsPlaying()) Stop(); + if (player->IsPlaying()) Stop(); else { int start=0,end=0; GetTimesSelection(start,end); diff --git a/core/audio_display.h b/core/audio_display.h index 03f4f85d0..11961627b 100644 --- a/core/audio_display.h +++ b/core/audio_display.h @@ -42,6 +42,7 @@ // Headers #include #include "audio_provider.h" +#include "audio_player.h" ////////////// @@ -52,6 +53,7 @@ class AudioBox; class AudioKaraoke; class VideoDisplay; + ///////////////// // Display class class AudioDisplay: public wxWindow { @@ -109,10 +111,12 @@ private: void UpdatePosition(int pos,bool IsSample=false); public: + AudioProvider *provider; + AudioPlayer *player; + bool NeedCommit; bool loaded; int w,h; - AudioProvider *provider; AudioBox *box; AudioKaraoke *karaoke; wxScrollBar *ScrollBar; diff --git a/core/audio_player.cpp b/core/audio_player.cpp index 1d86c6e00..a4ce6b60a 100644 --- a/core/audio_player.cpp +++ b/core/audio_player.cpp @@ -37,7 +37,7 @@ /////////// // Headers #include -#include "audio_player.h" +#include "audio_player_portaudio.h" #include "audio_provider.h" @@ -55,6 +55,7 @@ AudioPlayer::~AudioPlayer() { if (displayTimer) { displayTimer->Stop(); } + CloseStream(); } @@ -108,3 +109,20 @@ END_EVENT_TABLE() void AudioPlayer::OnStopAudio(wxCommandEvent &event) { Stop(false); } + + +////////////// +// Get player +AudioPlayer* AudioPlayer::GetAudioPlayer() { + // Prepare + AudioPlayer *player; + + // Get player + player = new PortAudioPlayer; + + // Got player? + if (!player) throw _T("Unable to create audio player."); + + // Return + return player; +} diff --git a/core/audio_player.h b/core/audio_player.h index e9fe4624b..ccb7f4841 100644 --- a/core/audio_player.h +++ b/core/audio_player.h @@ -63,6 +63,9 @@ public: AudioPlayer(); virtual ~AudioPlayer(); + virtual void OpenStream() {} + virtual void CloseStream() {} + virtual void Play(__int64 start,__int64 count)=0; // Play sample range virtual void Stop(bool timerToo=true)=0; // Stop playing virtual void RequestStop(); // Request it to stop playing in a thread-safe way @@ -83,6 +86,8 @@ public: void SetDisplayTimer(wxTimer *timer); virtual wxMutex *GetMutex(); + static AudioPlayer* GetAudioPlayer(); + DECLARE_EVENT_TABLE() }; diff --git a/core/audio_player_portaudio.h b/core/audio_player_portaudio.h index 3e9ce663e..79b7e8f4f 100644 --- a/core/audio_player_portaudio.h +++ b/core/audio_player_portaudio.h @@ -65,14 +65,13 @@ private: static int PortAudioPlayer::paCallback(void *inputBuffer, void *outputBuffer, unsigned long framesPerBuffer, PaTimestamp outTime, void *userData); -protected: - void OpenStream(); - void CloseStream(); - public: PortAudioPlayer(); ~PortAudioPlayer(); + void OpenStream(); + void CloseStream(); + void Play(__int64 start,__int64 count); void Stop(bool timerToo=true); bool IsPlaying() { return playing; } diff --git a/core/audio_provider.cpp b/core/audio_provider.cpp index 485a8de81..c1e53377f 100644 --- a/core/audio_provider.cpp +++ b/core/audio_provider.cpp @@ -177,8 +177,19 @@ AudioProvider *AudioProvider::GetAudioProvider(wxString filename, AudioDisplay * throw _T("Could not initialize any audio provider."); } - // Set up provider - provider->SetDisplayTimer(&display->UpdateTimer); + // Change provider to RAM/HD cache if needed + if (false) { + AudioProvider *final = NULL; + + //final = new RAMAudioProvider(provider); + //final = new HDAudioProvider(provider); + + // Reassign + if (final) { + delete provider; + provider = final; + } + } // Return return provider; diff --git a/core/audio_provider.h b/core/audio_provider.h index c8d169b5a..64eefacda 100644 --- a/core/audio_provider.h +++ b/core/audio_provider.h @@ -43,7 +43,7 @@ #include #include #include "avisynth_wrap.h" -#include "audio_player_portaudio.h" +#include "audio_player.h" ////////////// @@ -53,7 +53,7 @@ class AudioDisplay; //////////////////////// // Audio provider class -class AudioProvider : public PortAudioPlayer { +class AudioProvider { private: void *raw; int raw_len; diff --git a/core/audio_provider_avs.cpp b/core/audio_provider_avs.cpp index cf18a0b82..ac6580994 100644 --- a/core/audio_provider_avs.cpp +++ b/core/audio_provider_avs.cpp @@ -54,7 +54,6 @@ ////////////// // Constructor AvisynthAudioProvider::AvisynthAudioProvider(wxString _filename) { - SetProvider(this); type = AUDIO_PROVIDER_NONE; blockcache = NULL; blockcount = 0; @@ -64,7 +63,6 @@ AvisynthAudioProvider::AvisynthAudioProvider(wxString _filename) { try { OpenAVSAudio(); - OpenStream(); } catch (...) { Unload(); @@ -76,7 +74,6 @@ AvisynthAudioProvider::AvisynthAudioProvider(wxString _filename) { ////////////// // Destructor AvisynthAudioProvider::~AvisynthAudioProvider() { - CloseStream(); Unload(); } diff --git a/core/video_display.cpp b/core/video_display.cpp index e67070c5c..82095a135 100644 --- a/core/video_display.cpp +++ b/core/video_display.cpp @@ -887,8 +887,8 @@ void VideoDisplay::OnPlayTimer(wxTimerEvent &event) { // Sync audio if (nextFrame % 10 == 0) { __int64 audPos = audio->GetSampleAtMS(VFR_Output.GetTimeAtFrame(nextFrame)); - __int64 curPos = audio->provider->GetCurrentPosition(); - if (abs(int(audPos-curPos)) > audio->provider->GetSampleRate() / 10) audio->provider->SetCurrentPosition(audPos); + __int64 curPos = audio->player->GetCurrentPosition(); + if (abs(int(audPos-curPos)) > audio->provider->GetSampleRate() / 10) audio->player->SetCurrentPosition(audPos); } }