From: Stuart C. <stu...@us...> - 2009-01-29 07:37:10
|
Update of /cvsroot/ingex/ingex/studio/ace-tao/Ingexgui/src In directory 23jxhf1.ch3.sourceforge.com:/tmp/cvs-serv8846/studio/ace-tao/Ingexgui/src Modified Files: Makefile.am controller.cpp controller.h dialogues.cpp dialogues.h dragbuttonlist.cpp help.cpp ingexgui.cpp ingexgui.h player.cpp player.h recordergroup.cpp recordergroup.h Log Message: capture: Add support for NTSC video and audio capture IngexGui: Increased funtionality for jog/shuttle control Recorder: Avoid database access at start of each recording. createaaf: Add support for NTSC formats (see option --ntsc). Index: player.h =================================================================== RCS file: /cvsroot/ingex/ingex/studio/ace-tao/Ingexgui/src/player.h,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** player.h 6 Nov 2008 19:58:39 -0000 1.7 --- player.h 29 Jan 2009 07:36:58 -0000 1.8 *************** *** 1,5 **** /*************************************************************************** ! * Copyright (C) 2006-2008 British Broadcasting Corporation * * - all rights reserved. * * * * This program is free software; you can redistribute it and/or modify * --- 1,8 ---- /*************************************************************************** ! * $Id$ * ! * * ! * Copyright (C) 2006-2009 British Broadcasting Corporation * * - all rights reserved. * + * Author: Matthew Marks * * * * This program is free software; you can redistribute it and/or modify * *************** *** 27,40 **** #include "LocalIngexPlayer.h" #include <wx/wx.h> //File poll timer checks for files appearing after completion of a recording #define FILE_POLL_TIMER_INTERVAL 250 //ms #define MAX_SPEED 64 //times normal; must be power of 2 DECLARE_EVENT_TYPE(wxEVT_PLAYER_MESSAGE, -1) - namespace prodauto - { - enum PlayerEventType { STATE_CHANGE = 0, --- 30,42 ---- #include "LocalIngexPlayer.h" #include <wx/wx.h> + #include <wx/socket.h> //File poll timer checks for files appearing after completion of a recording #define FILE_POLL_TIMER_INTERVAL 250 //ms #define MAX_SPEED 64 //times normal; must be power of 2 + #define TRAFFIC_CONTROL_PORT 2000 DECLARE_EVENT_TYPE(wxEVT_PLAYER_MESSAGE, -1) enum PlayerEventType { STATE_CHANGE = 0, *************** *** 42,60 **** FRAME_DISPLAYED, NEW_FILESET, ! WITHIN_TAKE, CLOSE_REQ, KEYPRESS, PROGRESS_BAR_DRAG, SPEED_CHANGE, ! QUADRANT_CLICK }; ! enum PlayerMode { ! PLAY, ! PLAY_BACKWARDS, ! PAUSE, ! STOP, ! CLOSE ! }; enum OSDtype { --- 44,66 ---- FRAME_DISPLAYED, NEW_FILESET, ! AT_START, ! WITHIN, ! AT_END, CLOSE_REQ, KEYPRESS, PROGRESS_BAR_DRAG, SPEED_CHANGE, ! QUADRANT_CLICK, }; ! namespace PlayerMode { //this avoids clashes with different enums with the same member names ! enum EnumType { ! PLAY, ! PLAY_BACKWARDS, ! PAUSE, ! STOP, ! CLOSE ! }; ! } enum OSDtype { *************** *** 67,74 **** /// Class with methods that are called by the player. ! class Listener : public IngexPlayerListener { public: ! Listener(Player *); void SetStartIndex(const int); void ClearCuePoints(); --- 73,80 ---- /// Class with methods that are called by the player. ! class Listener : public prodauto::IngexPlayerListener { public: ! Listener(Player *, prodauto::IngexPlayerListenerRegistry *); void SetStartIndex(const int); void ClearCuePoints(); *************** *** 90,112 **** unsigned int mStartIndex; unsigned int mLastCuePointNotified; ! // std::map<int64_t, int> mCuePointMap; std::vector<int64_t> mCuePoints; }; ! /// Class representing the X11/SDI MXF video player. ! class Player : public wxEvtHandler, LocalIngexPlayer { public: ! Player(wxEvtHandler *, const bool, const PlayerOutputType, const OSDtype); ~Player(); bool IsOK(); void Enable(bool); ! void Load(std::vector<std::string> * = 0, std::vector<std::string> * = 0, PlayerInputType = MXF_INPUT, int64_t = 0, std::vector<int64_t> * = 0, int = 0, unsigned int = 0); void SelectTrack(const int, const bool); void SetOSD(const OSDtype); void EnableSDIOSD(bool = true); ! void SetOutputType(const PlayerOutputType); ! void Play(); ! void PlayBackwards(); void Pause(); void Step(bool); --- 96,118 ---- unsigned int mStartIndex; unsigned int mLastCuePointNotified; ! // std::map<int64_t, int> mCuePointMap;ic std::vector<int64_t> mCuePoints; }; ! /// Class representing the X11/SDI video/audio player. ! class Player : public wxEvtHandler, prodauto::LocalIngexPlayer { public: ! Player(wxEvtHandler *, const bool, const prodauto::PlayerOutputType, const OSDtype); ~Player(); bool IsOK(); void Enable(bool); ! void Load(std::vector<std::string> * = 0, std::vector<std::string> * = 0, prodauto::PlayerInputType = prodauto::MXF_INPUT, int64_t = 0, std::vector<int64_t> * = 0, int = 0, unsigned int = 0); void SelectTrack(const int, const bool); void SetOSD(const OSDtype); void EnableSDIOSD(bool = true); ! void SetOutputType(const prodauto::PlayerOutputType); ! void Play(const bool = false, const bool = false); ! void PlayAbsolute(const int); void Pause(); void Step(bool); *************** *** 115,136 **** bool Within(); bool AtEnd(); bool ExtOutputIsAvailable(); bool AtMaxForwardSpeed(); bool AtMaxReverseSpeed(); void AudioFollowsVideo(const bool); - // std::vector<bool> GetFilesStatus(); private: ! bool Start(std::vector<std::string> * = 0, std::vector<std::string> * = 0, PlayerInputType = MXF_INPUT, int64_t = 0, std::vector<int64_t> * = 0, int = 0, unsigned int = 0); void OnFrameDisplayed(wxCommandEvent&); - // void OnPlayerClosing(wxCommandEvent&); void OnFilePollTimer(wxTimerEvent&); ! void OnStateChange(wxCommandEvent& event); ! void OnSpeedChange(wxCommandEvent& event); ! void OnProgressBarDrag(wxCommandEvent& event); Listener * mListener; OSDtype mOSDtype; bool mEnabled; bool mOK; ! PlayerMode mMode; int mStartIndex; std::string mDesiredTrackName; --- 121,146 ---- bool Within(); bool AtEnd(); + bool LastPlayingBackwards(); bool ExtOutputIsAvailable(); bool AtMaxForwardSpeed(); bool AtMaxReverseSpeed(); + void MuteAudio(const bool); void AudioFollowsVideo(const bool); private: ! bool Start(std::vector<std::string> * = 0, std::vector<std::string> * = 0, prodauto::PlayerInputType = prodauto::MXF_INPUT, int64_t = 0, std::vector<int64_t> * = 0, int = 0, unsigned int = 0); ! void SetWindowName(const wxString & name = wxT("")); void OnFrameDisplayed(wxCommandEvent&); void OnFilePollTimer(wxTimerEvent&); ! void OnStateChange(wxCommandEvent&); ! void OnSpeedChange(wxCommandEvent&); ! void OnProgressBarDrag(wxCommandEvent&); ! void OnSocketEvent(wxSocketEvent&); ! void TrafficControl(const bool, const bool = false); Listener * mListener; + prodauto::IngexPlayerListenerRegistry mListenerRegistry; OSDtype mOSDtype; bool mEnabled; bool mOK; ! PlayerMode::EnumType mMode; int mStartIndex; std::string mDesiredTrackName; *************** *** 138,142 **** std::vector<std::string> mFileNames; std::vector<std::string> mTrackNames; ! PlayerInputType mInputType; std::vector<bool> mOpened; std::vector<int64_t> mCuePoints; --- 148,152 ---- std::vector<std::string> mFileNames; std::vector<std::string> mTrackNames; ! prodauto::PlayerInputType mInputType; std::vector<bool> mOpened; std::vector<int64_t> mCuePoints; *************** *** 146,152 **** unsigned int mLastRequestedCuePoint; int mSpeed; DECLARE_EVENT_TABLE() }; - } #endif --- 156,166 ---- unsigned int mLastRequestedCuePoint; int mSpeed; + wxString mName; + bool mMuted; + bool mLastPlayingBackwards; + wxSocketClient * mSocket; + bool mTrafficControl; DECLARE_EVENT_TABLE() }; #endif Index: dragbuttonlist.cpp =================================================================== RCS file: /cvsroot/ingex/ingex/studio/ace-tao/Ingexgui/src/dragbuttonlist.cpp,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** dragbuttonlist.cpp 10 Oct 2008 16:50:49 -0000 1.5 --- dragbuttonlist.cpp 29 Jan 2009 07:36:58 -0000 1.6 *************** *** 1,5 **** /*************************************************************************** ! * Copyright (C) 2006-2008 British Broadcasting Corporation * * - all rights reserved. * * * * This program is free software; you can redistribute it and/or modify * --- 1,8 ---- /*************************************************************************** ! * $Id$ * ! * * ! * Copyright (C) 2006-2009 British Broadcasting Corporation * * - all rights reserved. * + * Author: Matthew Marks * * * * This program is free software; you can redistribute it and/or modify * *************** *** 21,24 **** --- 24,28 ---- #include "dragbuttonlist.h" #include "ingexgui.h" + #include "eventlist.h" #include "avid_mxf_info.h" Index: controller.cpp =================================================================== RCS file: /cvsroot/ingex/ingex/studio/ace-tao/Ingexgui/src/controller.cpp,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** controller.cpp 23 Jan 2009 19:46:40 -0000 1.5 --- controller.cpp 29 Jan 2009 07:36:58 -0000 1.6 *************** *** 1,5 **** /*************************************************************************** ! * Copyright (C) 2006-2008 British Broadcasting Corporation * * - all rights reserved. * * * * This program is free software; you can redistribute it and/or modify * --- 1,8 ---- /*************************************************************************** ! * $Id$ * ! * * ! * Copyright (C) 2006-2009 British Broadcasting Corporation * * - all rights reserved. * + * Author: Matthew Marks * * * * This program is free software; you can redistribute it and/or modify * *************** *** 37,41 **** /// @param handler The handler where events will be sent. Controller::Controller(const wxString & name, Comms * comms, wxEvtHandler * handler) ! : wxThread(wxTHREAD_JOINABLE), mComms(comms), mName(name), mTimecodeRunning(false), mReconnecting(false), mPendingCommand(NONE), mPrevCommand(NONE) //joinable means we can wait until the thread terminates, and this object doesn't delete itself when that happens { mCondition = new wxCondition(mMutex); --- 40,44 ---- /// @param handler The handler where events will be sent. Controller::Controller(const wxString & name, Comms * comms, wxEvtHandler * handler) ! : wxThread(wxTHREAD_JOINABLE), mComms(comms), mName(name), mTimecodeRunning(false), mReconnecting(false), mPendingCommand(NONE), mPendingCommandSent(false), mPrevCommand(NONE) //joinable means we can wait until the thread terminates, and this object doesn't delete itself when that happens { mCondition = new wxCondition(mMutex); *************** *** 120,125 **** mPendingCommand = ADD_PROJECT_NAMES; //act on it later or detect if it is superceded while retrying } ! if (!mReconnecting) { //can't send a command now Signal(ADD_PROJECT_NAMES); } } --- 123,129 ---- mPendingCommand = ADD_PROJECT_NAMES; //act on it later or detect if it is superceded while retrying } ! if (!mReconnecting) { //can send a command now Signal(ADD_PROJECT_NAMES); + mPendingCommandSent = true; } } *************** *** 147,150 **** --- 151,155 ---- mMutex.Unlock(); Signal(RECORD); + mPendingCommandSent = true; } } *************** *** 172,175 **** --- 177,181 ---- mMutex.Unlock(); Signal(STOP); + mPendingCommandSent = true; } } *************** *** 252,260 **** //let the parent know GetNextHandler()->AddPendingEvent(event); ! //buffer the command if ((RECORD == event.GetCommand() || STOP == event.GetCommand() || ADD_PROJECT_NAMES == event.GetCommand()) && NONE == mPendingCommand) { //make sure the event doesn't override a command received while waiting for a response //std::cerr << "new pending command" << std::endl; //execute command when reconnected mPendingCommand = event.GetCommand(); } } --- 258,267 ---- //let the parent know GetNextHandler()->AddPendingEvent(event); ! //buffer the failed command if ((RECORD == event.GetCommand() || STOP == event.GetCommand() || ADD_PROJECT_NAMES == event.GetCommand()) && NONE == mPendingCommand) { //make sure the event doesn't override a command received while waiting for a response //std::cerr << "new pending command" << std::endl; //execute command when reconnected mPendingCommand = event.GetCommand(); + mPendingCommandSent = false; //needs to be sent again when communication re-established } } *************** *** 270,282 **** //std::cerr << "pending command successfully sent" << std::endl; mPendingCommand = NONE; GetNextHandler()->AddPendingEvent(event); mPollingTimer->Start(POLLING_INTERVAL, wxTIMER_ONE_SHOT); //back to normal } ! else if (NONE != mPendingCommand) { //pending command not sent yet ! //Send the pending command again immediately, with updated parameters //std::cerr << "pending command being sent" << std::endl; ! Signal(mPendingCommand); } ! else { //std::cerr << "ordinary notification" << std::endl; GetNextHandler()->AddPendingEvent(event); --- 277,293 ---- //std::cerr << "pending command successfully sent" << std::endl; mPendingCommand = NONE; + mPendingCommandSent = false; //default state GetNextHandler()->AddPendingEvent(event); mPollingTimer->Start(POLLING_INTERVAL, wxTIMER_ONE_SHOT); //back to normal } ! else if (NONE != mPendingCommand) { //not in idle state ! if (!mPendingCommandSent) { ! //Send the pending command again immediately, with updated parameters //std::cerr << "pending command being sent" << std::endl; ! Signal(mPendingCommand); ! mPendingCommandSent = true; ! } } ! else { //idle state //std::cerr << "ordinary notification" << std::endl; GetNextHandler()->AddPendingEvent(event); *************** *** 480,487 **** ProdAuto::MxfDuration preroll = mPreroll; CORBA::BooleanSeq rec_enable = mEnableList; ! char * project = CORBA::string_dup(mProject.mb_str(*wxConvCurrent)); mMutex.Unlock(); try { ! rc = mRecorder->Start(timecode, preroll, rec_enable, project, false); } catch (const CORBA::Exception & e) { --- 491,498 ---- ProdAuto::MxfDuration preroll = mPreroll; CORBA::BooleanSeq rec_enable = mEnableList; ! std::string project = (const char *) mProject.mb_str(*wxConvCurrent); mMutex.Unlock(); try { ! rc = mRecorder->Start(timecode, preroll, rec_enable, project.c_str(), false); } catch (const CORBA::Exception & e) { Index: help.cpp =================================================================== RCS file: /cvsroot/ingex/ingex/studio/ace-tao/Ingexgui/src/help.cpp,v retrieving revision 1.9 retrieving revision 1.10 diff -C2 -d -r1.9 -r1.10 *** help.cpp 23 Jan 2009 19:46:40 -0000 1.9 --- help.cpp 29 Jan 2009 07:36:58 -0000 1.10 *************** *** 1,5 **** /*************************************************************************** ! * Copyright (C) 2006-2008 British Broadcasting Corporation * ! * - All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * --- 1,8 ---- /*************************************************************************** ! * $Id$ * ! * * ! * Copyright (C) 2006-2009 British Broadcasting Corporation * ! * - all rights reserved. * ! * Author: Matthew Marks * * * * This program is free software; you can redistribute it and/or modify * *************** *** 82,86 **** message += wxT(" If an SDI card has been detected, playback can be to an external monitor exclusively, or as well as, the computer monitor - select from the #Player type# submenu of the #Player# menu. (If external playback is disabled, an SDI card will output whatever is connected to its input.)"); #endif ! message += wxT("\n\nThe player window will only appear for the first time when at least one video file from the recording is available, which may take a while, depending on post-roll and the configuration of the recorders. If not all files appear simultaneously, the player will start with what is available and reload automatically (maintaining its position in the recording) as more files become available.\n\nThe video tracks recorded during the take appear as radio buttons when the #Playback# tab, below the transport controls, is clicked. The space given to this tab can be varied by dragging the dotted splitter line below it. Each radio button has a tool-tip showing the associated file name. Only the tracks currently available are enabled.\n\nA quad split is also provided, and when selected the player window title will show the names of the tracks displayed. If more than four tracks are available, the first four are shown on the quad split. Note that it takes more processing power and bandwidth to display the quad split than an individual track, so the quad split may play slowly depending on the capabilities of the computer and the network.\n\nThe first pair of audio tracks are normally played, but a #Player# menu option allows the audio to follow the current video source.\n\nThe #Playback# tab also shows the project name used when the recording was made.\n\nPlayer-specific shortcut keys (see #Shortcuts# submenu of #Help# menu) are #F7# and #F8# to cycle through the tracks, #J#, #K# and #L# for reverse (with fast reverse)/pause/forwards (with fast forwards), #Space# to toggle between forwards/reverse (depending on what was last selected) and pause, and #3# and #4# for stepping by frame. Shortcut keys will work when either the controller or the player window has focus on the computer desktop, but some will not work if the #Description# field has focus - see the #Record tab# help section. In addition, when the player has focus, left and right arrows become available as alternatives to #3# and #4# for stepping.\n\nThe player also responds to the mouse. You can drag the progress bar pointer, or click anywhere on the progress bar to jump to that position. You can also click on the image to toggle between the quad split and the source shown in the quadrant of the quad split in which you click.\n\nWhen a new recording is made, the player window is blanked rather than disappearing. This allows the player to maintain its position on the screen during a session."); message += wxT("\n\nIt is possible to use the player to open arbitrary MXF and MOV files. To do this, select the appropriate option from the #Player# menu and pick the files to play. In the case of MXF, you can make a multiple selection, whereas you can only select one MOV file. When you have chosen file(s) to play, the #Play files# button is enabled, which allows you to toggle between playing the file(s) and recordings you have made this session."); message += wxT("\n\nThe #Player# menu also contains options to show on-screen position instead of timecode, or no on-screen display at all"); --- 85,89 ---- message += wxT(" If an SDI card has been detected, playback can be to an external monitor exclusively, or as well as, the computer monitor - select from the #Player type# submenu of the #Player# menu. (If external playback is disabled, an SDI card will output whatever is connected to its input.)"); #endif ! message += wxT("\n\nThe player window will only appear for the first time when at least one video file from the recording is available, which may take a while, depending on post-roll and the configuration of the recorders. If not all files appear simultaneously, the player will start with what is available and reload automatically (maintaining its position in the recording) as more files become available.\n\nThe video tracks recorded during the take appear as radio buttons when the #Playback# tab, below the transport controls, is clicked. The space given to this tab can be varied by dragging the dotted splitter line below it. Each radio button has a tool-tip showing the associated file name. Only the tracks currently available are enabled.\n\nA quad split is also provided, and when selected the player window title will show the names of the tracks displayed. If more than four tracks are available, the first four are shown on the quad split. Note that it takes more processing power and bandwidth to display the quad split than an individual track, so the quad split may play slowly depending on the capabilities of the computer and the network.\n\nThe first pair of audio tracks are normally played, but a #Player# menu option allows the audio to follow the current video source.\n\nThe #Playback# tab also shows the project name used when the recording was made.\n\nPlayer-specific shortcut keys (see #Shortcuts# submenu of #Help# menu) are #F7# and #F8# to cycle through the tracks, #J#, #K# and #L# for reverse (with fast reverse)/pause/forwards (with fast forwards), #Space# to toggle between forwards/reverse (depending on what was last selected) and pause, #3# and #4# for stepping by frame, and #M# to toggle audio mute. Shortcut keys will work when either the controller or the player window has focus on the computer desktop, but some will not work if the #Description# field has focus - see the #Record tab# help section. In addition, when the player has focus, left and right arrows become available as alternatives to #3# and #4# for stepping.\n\nThe player also responds to the mouse. You can drag the progress bar pointer, or click anywhere on the progress bar to jump to that position. You can also click on the image to toggle between the quad split and the source shown in the quadrant of the quad split in which you click.\n\nWhen a new recording is made, the player window is blanked rather than disappearing. This allows the player to maintain its position on the screen during a session."); message += wxT("\n\nIt is possible to use the player to open arbitrary MXF and MOV files. To do this, select the appropriate option from the #Player# menu and pick the files to play. In the case of MXF, you can make a multiple selection, whereas you can only select one MOV file. When you have chosen file(s) to play, the #Play files# button is enabled, which allows you to toggle between playing the file(s) and recordings you have made this session."); message += wxT("\n\nThe #Player# menu also contains options to show on-screen position instead of timecode, or no on-screen display at all"); *************** *** 92,97 **** notebook->AddPage(player, wxT("Video player and playback tab")); wxTextCtrl * cues = new wxTextCtrl(notebook, -1, wxT(""), wxDefaultPosition, wxDefaultSize, wxTE_READONLY | wxTE_MULTILINE); ! message = wxT("At the bottom of the controller window is a list of start, stop and cue point events. The space given to this display can be varied by dragging the dotted splitter line above it. The display shows the type of event, and when it occurred both in absolute timecode and relative position.\n\nCue points can be added at will during recording with #Mark cue# (or #F2#). This will capture and display the current timecode with the list of predefined cue points, one of which can be chosen by pressing a number key or clicking on a row label. Alternatively, #F2# can be pressed again to choose a default cue point, or #ENTER# will choose the highlighted cue point. This can also be edited by clicking it, after which it can be chosen quickly by pressing #ENTER# twice.\n\nOnce a cue point has been chosen, its text (but not its colour) can also be edited by clicking on its row in the list in the main window, or it can be removed with #Delete Cue Point#. This can only be done while the recording is still in progress, because the cue points are sent to the recorder(s) at the end of the recording.\n\nDuring playback, cue points are shown in the player and are automatically highlighted as they are played through. The player will jump to them if they are clicked, and start playing from them if they are double-clicked. (Note that the player's burnt-in timecode display appears in red when at a cue point.) The adjacent take navigation buttons allow different recordings to be selected quickly (and have shortcuts - see the #Help->Shortcuts# menu).\n\nThere are #Misc# menu options to clear the cue point list, and prevent it logging more than one recording."); StyleAndWrite(cues, message); notebook->AddPage(cues, wxT("Cue point display and controls")); --- 95,106 ---- notebook->AddPage(player, wxT("Video player and playback tab")); + wxTextCtrl * jogshuttle = new wxTextCtrl(notebook, -1, wxT(""), wxDefaultPosition, wxDefaultSize, wxTE_READONLY | wxTE_MULTILINE); + message = wxT("A Shuttle Pro or Shuttle Pro 2 USB jog/shuttle control can be used to provide the following functions:\n\nJog wheel and shuttle ring: jog/shuttle the player.\n\nTop row of buttons (L-R):\n\t#Record#\n\t#Mark cue#\n\t#Stop#*\n\t#Stop#*\n\n*The two right hand buttons need to be pressed simultaneously, or one of the buttons plus one of the black buttons on the Shuttle Pro 2, to stop.\n\nSecond row of buttons (L-R):\n\tPlay backwards\n\tPause\n\tPlay forwards\n\tMute/Unmute\n\ttoggle #Play Files#.\n\nLeft hand long silver buttons:\n\tUp/Down cue points.\n\nRight hand long silver buttons:\n\tsame as #Previous Take# and #Next Take# buttons."); + StyleAndWrite(jogshuttle, message); + notebook->AddPage(jogshuttle, wxT("Jog/Shuttle Control")); + + wxTextCtrl * cues = new wxTextCtrl(notebook, -1, wxT(""), wxDefaultPosition, wxDefaultSize, wxTE_READONLY | wxTE_MULTILINE); ! message = wxT("At the bottom of the controller window is a list of start, stop and cue point events. The space given to this display can be varied by dragging the dotted splitter line above it. The display shows the type of event, and when it occurred both in absolute timecode and relative position.\n\nCue points can be added at will during recording with #Mark cue# (or #F2#). This will capture and display the current timecode with the list of predefined cue points, one of which can be chosen by pressing a number key or clicking on a row label. Alternatively, #F2# can be pressed again to choose a default cue point, or #ENTER# will choose the highlighted cue point. This can also be edited by clicking it, after which it can be chosen quickly by pressing #ENTER# twice.\n\nOnce a cue point has been chosen, its text (but not its colour) can also be edited by clicking on the appropriate entry in the #Event# column in the list in the main window, or it can be removed with #Delete Cue Point#. This can only be done while the recording is still in progress, because the cue points are sent to the recorder(s) at the end of the recording.\n\nDuring playback, cue points are shown in the player and are automatically highlighted as they are played through. The player will jump to them if they are clicked, and start playing from them if they are double-clicked. (Note that the player's burnt-in timecode display appears in red when at a cue point.) The adjacent take navigation buttons allow different recordings to be selected quickly (and have shortcuts - see the #Help->Shortcuts# menu).\n\nThere are #Misc# menu options to clear the cue point list, and prevent it logging more than one recording."); StyleAndWrite(cues, message); notebook->AddPage(cues, wxT("Cue point display and controls")); *************** *** 136,140 **** message += wxT("not "); #endif ! message += wxT("included. Please send feedback to mat...@us....\n\nVersion $Id$\n\nCopyright (C) British Broadcasting Corporation 2006-2008 - All rights reserved.\n\n$Date$."); textBox->SetValue(message); }; --- 145,149 ---- message += wxT("not "); #endif ! message += wxT("included. Please send feedback to mat...@us....\n\nVersion $Id$\n\nCopyright (C) British Broadcasting Corporation 2006-2009 - All rights reserved.\n\n$Date$."); textBox->SetValue(message); }; Index: ingexgui.h =================================================================== RCS file: /cvsroot/ingex/ingex/studio/ace-tao/Ingexgui/src/ingexgui.h,v retrieving revision 1.9 retrieving revision 1.10 diff -C2 -d -r1.9 -r1.10 *** ingexgui.h 23 Jan 2009 19:46:40 -0000 1.9 --- ingexgui.h 29 Jan 2009 07:36:58 -0000 1.10 *************** *** 1,5 **** /*************************************************************************** ! * Copyright (C) 2006-2008 British Broadcasting Corporation * * - all rights reserved. * * * * This program is free software; you can redistribute it and/or modify * --- 1,8 ---- /*************************************************************************** ! * $Id$ * ! * * ! * Copyright (C) 2006-2009 British Broadcasting Corporation * * - all rights reserved. * + * Author: Matthew Marks * * * * This program is free software; you can redistribute it and/or modify * *************** *** 21,25 **** #ifndef _INGEXGUI_H_ #define _INGEXGUI_H_ - #include <vector> #include "comms.h" #include "controller.h" --- 24,27 ---- *************** *** 43,48 **** #define TITLE wxT("Ingex Control") - #define CUE_LABEL wxT("Cue") - #define BUTTON_WARNING_COLOUR wxColour(0xFF, 0x80, 0x00) --- 45,48 ---- *************** *** 59,62 **** --- 59,66 ---- class TickTreeCtrl; class DragButtonList; + namespace ingex { + class JogShuttle; + } + class JSListener; class *************** *** 68,109 **** }; - WX_DECLARE_OBJARRAY(ProdAuto::TrackList_var, ArrayOfTrackList_var); - WX_DECLARE_OBJARRAY(CORBA::StringSeq_var, ArrayOfStringSeq_var); - - /// Class holding information about a take, for later replay. - /// Holds the position of the take within the displayed list of events, the project name, an array of lists of files - /// (one for each recorder) and an array of lists of track names (ditto). - /// Also arrays of cue point colour codes, timecodes and frame numbers. - class TakeInfo - { - public: - TakeInfo(const unsigned long startIndex, const wxString & projectName) : mStartIndex(startIndex), mProjectName(projectName) {}; - void AddRecorder(ProdAuto::TrackList_var trackList, CORBA::StringSeq_var fileList) {mFiles.Add(fileList); mTracks.Add(trackList);}; //adds a set of tracks provided by a recorder at the end of a recording - void AddCuePoint(const int64_t frame, const ProdAuto::MxfTimecode timecode, const ProdAuto::LocatorColour::EnumType colourCode) {mCuePointFrames.push_back(frame); mCueTimecodes.push_back(timecode); mCueColourCodes.push_back(colourCode);}; //no text here because it's stored in the event list (which means it can be edited) - void DeleteCuePoint(const unsigned long index) {mCuePointFrames.erase(mCuePointFrames.begin() + index); mCueColourCodes.erase(mCueColourCodes.begin() + index); mCueTimecodes.erase(mCueTimecodes.begin() + index);}; - - const unsigned long GetStartIndex() {return mStartIndex;}; - ArrayOfStringSeq_var * GetFiles() {return &mFiles;}; - const wxString GetProjectName() {return mProjectName;}; - ArrayOfTrackList_var * GetTracks() {return &mTracks;}; - std::vector<int64_t> * GetCuePointFrames() {return &mCuePointFrames;}; - std::vector<ProdAuto::LocatorColour::EnumType> * GetCueColourCodes() {return &mCueColourCodes;}; - std::vector<ProdAuto::MxfTimecode> * GetCueTimecodes() {return &mCueTimecodes;}; - private: - const unsigned long mStartIndex; //the index in the event list for the start of this take - ArrayOfStringSeq_var mFiles; - const wxString mProjectName; - ArrayOfTrackList_var mTracks; //deletes itself - std::vector<int64_t> mCuePointFrames; - std::vector<ProdAuto::LocatorColour::EnumType> mCueColourCodes; - std::vector<ProdAuto::MxfTimecode> mCueTimecodes; - }; - - WX_DECLARE_OBJARRAY(TakeInfo, TakeInfoArray); - class Timepos; ! namespace prodauto { ! class Player; ! } class RecordButton; class HelpDlg; --- 72,77 ---- }; class Timepos; ! class Player; class RecordButton; class HelpDlg; *************** *** 112,115 **** --- 80,84 ---- class TestModeDlg; class wxToggleButton; + class EventList; /// The main displayed frame, at the heart of the application *************** *** 130,145 **** MENU_PrevTrack, MENU_NextTrack, ! MENU_3, ! MENU_4, MENU_Up, MENU_Down, ! MENU_PageUp, ! MENU_PageDown, ! MENU_Home, ! MENU_End, ! MENU_J, ! MENU_K, ! MENU_L, ! MENU_Space, MENU_AutoClear, MENU_ClearLog, --- 99,115 ---- MENU_PrevTrack, MENU_NextTrack, ! MENU_StepBackwards, ! MENU_StepForwards, ! MENU_Mute, MENU_Up, MENU_Down, ! MENU_PrevTake, ! MENU_NextTake, ! MENU_FirstTake, ! MENU_LastTake, ! MENU_PlayBackwards, ! MENU_Pause, ! MENU_PlayForwards, ! MENU_PlayPause, MENU_AutoClear, MENU_ClearLog, *************** *** 147,155 **** MENU_PlayMOV, MENU_PlayMXF, MENU_PlayerType, - MENU_PlayerExtOutput, MENU_PlayerAccelOutput, MENU_PlayerExtAccelOutput, MENU_PlayerExtUnaccelOutput, MENU_PlayerUnaccelOutput, MENU_PlayerOSD, --- 117,129 ---- MENU_PlayMOV, MENU_PlayMXF, + MENU_TogglePlayFile, MENU_PlayerType, MENU_PlayerAccelOutput, + #ifdef HAVE_DVS + MENU_PlayerEnableSDIOSD, + MENU_PlayerExtOutput, MENU_PlayerExtAccelOutput, MENU_PlayerExtUnaccelOutput, + #endif MENU_PlayerUnaccelOutput, MENU_PlayerOSD, *************** *** 157,161 **** MENU_PlayerRelativeTimecode, MENU_PlayerNoOSD, ! MENU_PlayerDisableSDIOSD, MENU_PlayerAudioFollowsVideo, MENU_TestMode, --- 131,135 ---- MENU_PlayerRelativeTimecode, MENU_PlayerNoOSD, ! MENU_PlayerMuteAudio, MENU_PlayerAudioFollowsVideo, MENU_TestMode, *************** *** 178,189 **** }; private: - enum EventType - { - START, - CUE, - // REVIEW, - STOP, - PROBLEM - }; enum Stat { --- 152,155 ---- *************** *** 209,224 **** void OnClearLog(wxCommandEvent&); void OnPlayerOSDChange(wxCommandEvent&); void OnPlayerSDIOSDChange(wxCommandEvent&); void OnPlayerOutputTypeChange(wxCommandEvent&); void OnPlayerAudioFollowsVideo(wxCommandEvent& WXUNUSED(event)); void OnQuit(wxCommandEvent&); void OnEventSelection(wxListEvent&); void OnEventActivated(wxListEvent&); - void OnEventBeginEdit(wxListEvent&); - void OnEventEndEdit(wxListEvent&); - void OnRestoreListLabel(wxCommandEvent&); void OnRefreshTimer(wxTimerEvent&); - void OnPrevTake(wxCommandEvent&); - void OnNextTake(wxCommandEvent&); void OnDeleteCue(wxCommandEvent&); void OnJumpToTimecode(wxCommandEvent&); --- 175,188 ---- void OnClearLog(wxCommandEvent&); void OnPlayerOSDChange(wxCommandEvent&); + #ifdef HAVE_DVS void OnPlayerSDIOSDChange(wxCommandEvent&); + #endif void OnPlayerOutputTypeChange(wxCommandEvent&); void OnPlayerAudioFollowsVideo(wxCommandEvent& WXUNUSED(event)); + void OnPlayerMuteAudio(wxCommandEvent& WXUNUSED(event)); void OnQuit(wxCommandEvent&); void OnEventSelection(wxListEvent&); void OnEventActivated(wxListEvent&); void OnRefreshTimer(wxTimerEvent&); void OnDeleteCue(wxCommandEvent&); void OnJumpToTimecode(wxCommandEvent&); *************** *** 238,251 **** void OnTestMode(wxCommandEvent&); void OnPlayFile(wxCommandEvent&); void UpdatePlayerAndEventControls(bool = false, bool = false); void UpdateTextShortcutStates(); - void AddEvent(EventType, const wxString = wxT(""), ProdAuto::MxfTimecode = InvalidMxfTimecode, const int64_t = 0, const wxString = wxT(""), const wxColour = wxT("WHITE"), const wxColour = wxT("BLACK"), const ProdAuto::LocatorColour::EnumType = ProdAuto::LocatorColour::DEFAULT_COLOUR); void SetStatus(Stat); ProdAuto::MxfDuration SetRoll(const wxChar *, int, const ProdAuto::MxfDuration &, wxStaticBoxSizer *); void ClearLog(); - void SelectAdjacentEvent(bool down); void ResetPlayer(); - void Play(const bool = false); void ResetToDisconnected(); void Log(const wxString &); --- 202,215 ---- void OnTestMode(wxCommandEvent&); void OnPlayFile(wxCommandEvent&); + void OnJogShuttleEvent(wxCommandEvent&); + void OnPrevTake(wxCommandEvent&); + void OnNextTake(wxCommandEvent&); void UpdatePlayerAndEventControls(bool = false, bool = false); void UpdateTextShortcutStates(); void SetStatus(Stat); ProdAuto::MxfDuration SetRoll(const wxChar *, int, const ProdAuto::MxfDuration &, wxStaticBoxSizer *); void ClearLog(); void ResetPlayer(); void ResetToDisconnected(); void Log(const wxString &); *************** *** 253,256 **** --- 217,221 ---- bool IsRecording(); void EnableButtonReliably(wxButton *, bool = true); + void CanEditCues(const bool); wxStaticBitmap * mStatusCtrl, * mAlertCtrl; *************** *** 260,264 **** wxButton * mStopButton, * mCueButton; RecordButton * mRecordButton; ! wxListView * mEventList; //used wxListCtrl for a while because wxListView crashed when you added an item - seems ok with 2.8 wxNotebook * mNotebook; wxButton * mDescClearButton; --- 225,229 ---- wxButton * mStopButton, * mCueButton; RecordButton * mRecordButton; ! EventList * mEventList; wxNotebook * mNotebook; wxButton * mDescClearButton; *************** *** 279,292 **** Stat mStatus; - long mStartEvent, mEndEvent; long mEditRateNumerator, mEditRateDenominator; - TakeInfoArray mTakeInfoArray; Timepos * mTimepos; ! TakeInfo * mCurrentTakeInfo; ! unsigned long mCurrentSelectedEvent; ! prodauto::Player * mPlayer; wxXmlDocument mSavedState; wxString mSavedStateFilename; - bool mLastPlayingBackwards; bool mDescriptionControlHasFocus; wxLogStream * mLogStream; --- 244,252 ---- Stat mStatus; long mEditRateNumerator, mEditRateDenominator; Timepos * mTimepos; ! Player * mPlayer; wxXmlDocument mSavedState; wxString mSavedStateFilename; bool mDescriptionControlHasFocus; wxLogStream * mLogStream; *************** *** 296,299 **** --- 256,261 ---- int64_t mFileModeFrameOffset; int64_t mTakeModeFrameOffset; + ingex::JogShuttle * mJogShuttle; + JSListener * mJSListener; wxDateTime mToday; DECLARE_EVENT_TABLE() Index: dialogues.h =================================================================== RCS file: /cvsroot/ingex/ingex/studio/ace-tao/Ingexgui/src/dialogues.h,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** dialogues.h 8 Oct 2008 10:16:06 -0000 1.4 --- dialogues.h 29 Jan 2009 07:36:58 -0000 1.5 *************** *** 1,5 **** /*************************************************************************** ! * Copyright (C) 2006-2008 British Broadcasting Corporation * * - all rights reserved. * * * * This program is free software; you can redistribute it and/or modify * --- 1,8 ---- /*************************************************************************** ! * $Id$ * ! * * ! * Copyright (C) 2006-2009 British Broadcasting Corporation * * - all rights reserved. * + * Author: Matthew Marks * * * * This program is free software; you can redistribute it and/or modify * *************** *** 23,26 **** --- 26,30 ---- #include <wx/wx.h> #include <wx/grid.h> + #include <vector> #include "ingexgui.h" *************** *** 221,226 **** --- 225,233 ---- wxSpinCtrl * mMaxGapTime; wxToggleButton * mRunButton; + wxStaticText * mRunStopMessage; + wxStaticText * mRunStopCountdown; wxButton * mCancelButton; wxTimer * mTimer; + wxTimeSpan mCountdown; bool mRecording; DECLARE_EVENT_TABLE() *************** *** 233,236 **** --- 240,244 ---- CuePointsDlg(wxWindow *, wxXmlDocument &); int ShowModal(const wxString = wxT("")); + void Shortcut(const int); const wxString GetDescription(); const wxColour GetColour(); *************** *** 241,244 **** --- 249,253 ---- void OnEditorHidden(wxGridEvent &); void Load(); + void Save(); void OnMenu(wxCommandEvent &); void OnOK(wxCommandEvent &); Index: recordergroup.h =================================================================== RCS file: /cvsroot/ingex/ingex/studio/ace-tao/Ingexgui/src/recordergroup.h,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** recordergroup.h 23 Jan 2009 19:46:40 -0000 1.4 --- recordergroup.h 29 Jan 2009 07:36:58 -0000 1.5 *************** *** 1,5 **** /*************************************************************************** ! * Copyright (C) 2006-2008 British Broadcasting Corporation * * - all rights reserved. * * * * This program is free software; you can redistribute it and/or modify * --- 1,8 ---- /*************************************************************************** ! * $Id$ * ! * * ! * Copyright (C) 2006-2009 British Broadcasting Corporation * * - all rights reserved. * + * Author: Matthew Marks * * * * This program is free software; you can redistribute it and/or modify * *************** *** 51,54 **** --- 54,58 ---- void SetCurrentProjectName(const wxString &); const wxString & GetCurrentProjectName(); + const wxString & GetCurrentDescription(); void Deselect(unsigned int); enum RecorderGroupCtrlEventType { *************** *** 91,94 **** --- 95,99 ---- wxSortedArrayString mProjectNames; wxString mCurrentProject; + wxString mCurrentDescription; DECLARE_EVENT_TABLE() }; Index: Makefile.am =================================================================== RCS file: /cvsroot/ingex/ingex/studio/ace-tao/Ingexgui/src/Makefile.am,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** Makefile.am 3 Sep 2008 15:18:41 -0000 1.3 --- Makefile.am 29 Jan 2009 07:36:58 -0000 1.4 *************** *** 1,4 **** # these are the headers for your project ! noinst_HEADERS = comms.h connection_matrix.h controller.h \ dialogues.h dragbuttonlist.h frame_info.h help.h ingexgui.h media_control.h \ --- 1,4 ---- # these are the headers for your project ! noinst_HEADERS = eventlist.h comms.h connection_matrix.h controller.h \ dialogues.h dragbuttonlist.h frame_info.h help.h ingexgui.h media_control.h \ *************** *** 15,26 **** # the application source, library search path, and link libraries ! ingexgui_SOURCES = IngexPlayer.h LocalIngexPlayer.h activity.xpm blank.xpm \ ! comms.cpp concerned.xpm controller.cpp dialogues.cpp dragbuttonlist.cpp \ ! exclamation.xpm ffx16.xpm ffx2.xpm ffx32.xpm ffx4.xpm ffx64.xpm ffx8.xpm frx16.xpm \ ! frx2.xpm frx32.xpm frx4.xpm frx64.xpm frx8.xpm happy.xpm help.cpp ingexgui.cpp \ ! ingexgui.xpm keyboard_input.h keyboard_input_connect.h noactivity.xpm \ ! on_screen_display.h paused.xpm play.xpm play_backwards.xpm player.cpp question.xpm \ ! record.xpm recordbutton.cpp recordergroup.cpp small_disabled.xpm small_enabled.xpm \ ! small_exclamation.xpm small_partial_enabled.xpm small_partial_rec.xpm small_question.xpm \ ! small_rec.xpm stop.xpm ticktree.cpp timepos.cpp x11_common.h ingexgui_LDFLAGS = $(WX_LIBS) --- 15,27 ---- # the application source, library search path, and link libraries ! ingexgui_SOURCES = $(WORKSPACE)/player/jogshuttle/JogShuttle.cpp IngexPlayer.h \ ! LocalIngexPlayer.h activity.xpm blank.xpm comms.cpp concerned.xpm controller.cpp \ ! dialogues.cpp dragbuttonlist.cpp eventlist.cpp exclamation.xpm ffx16.xpm ffx2.xpm \ ! ffx32.xpm ffx4.xpm ffx64.xpm ffx8.xpm frx16.xpm frx2.xpm frx32.xpm frx4.xpm \ ! frx64.xpm frx8.xpm happy.xpm help.cpp ingexgui.cpp ingexgui.xpm jogshuttle.cpp \ ! keyboard_input.h keyboard_input_connect.h noactivity.xpm on_screen_display.h paused.xpm \ ! play.xpm play_backwards.xpm player.cpp question.xpm record.xpm recordbutton.cpp \ ! recordergroup.cpp small_disabled.xpm small_enabled.xpm small_exclamation.xpm \ ! small_partial_enabled.xpm small_partial_rec.xpm small_question.xpm small_rec.xpm stop.xpm \ ! ticktree.cpp timepos.cpp x11_common.h ingexgui_LDFLAGS = $(WX_LIBS) Index: ingexgui.cpp =================================================================== RCS file: /cvsroot/ingex/ingex/studio/ace-tao/Ingexgui/src/ingexgui.cpp,v retrieving revision 1.9 retrieving revision 1.10 diff -C2 -d -r1.9 -r1.10 *** ingexgui.cpp 23 Jan 2009 19:46:40 -0000 1.9 --- ingexgui.cpp 29 Jan 2009 07:36:58 -0000 1.10 *************** *** 1,5 **** /*************************************************************************** ! * Copyright (C) 2006-2008 British Broadcasting Corporation * * - all rights reserved. * * * * This program is free software; you can redistribute it and/or modify * --- 1,8 ---- /*************************************************************************** ! * $Id$ * ! * * ! * Copyright (C) 2006-2009 British Broadcasting Corporation * [...1706 lines suppressed...] ! /// Returns true if in a state associated with recording ! bool IngexguiFrame::IsRecording() { return RECORDING == mStatus || RUNNING_UP == mStatus || RUNNING_DOWN == mStatus; } --- 1992,2005 ---- } ! /// Returns true if in a state associated with recording. ! bool IngexguiFrame::IsRecording() ! { return RECORDING == mStatus || RUNNING_UP == mStatus || RUNNING_DOWN == mStatus; } + + /// Enables or disable editing and deletion of cue points + void IngexguiFrame::CanEditCues(const bool canEdit) + { + mDeleteCueButton->Enable(canEdit); + mEventList->CanEdit(canEdit); + } Index: controller.h =================================================================== RCS file: /cvsroot/ingex/ingex/studio/ace-tao/Ingexgui/src/controller.h,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** controller.h 23 Jan 2009 19:46:40 -0000 1.4 --- controller.h 29 Jan 2009 07:36:58 -0000 1.5 *************** *** 90,93 **** --- 90,94 ---- bool mRouterRecorder; Command mPendingCommand; + bool mPendingCommandSent; wxDateTime mLastTimecodeRequest; ProdAuto::MxfTimecode mLastTimecodeReceived; Index: recordergroup.cpp =================================================================== RCS file: /cvsroot/ingex/ingex/studio/ace-tao/Ingexgui/src/recordergroup.cpp,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** recordergroup.cpp 23 Jan 2009 19:46:40 -0000 1.5 --- recordergroup.cpp 29 Jan 2009 07:36:58 -0000 1.6 *************** *** 1,5 **** /*************************************************************************** ! * Copyright (C) 2006-2008 British Broadcasting Corporation * * - all rights reserved. * * * * This program is free software; you can redistribute it and/or modify * --- 1,8 ---- /*************************************************************************** ! * $Id$ * ! * * ! * Copyright (C) 2006-2009 British Broadcasting Corporation * * - all rights reserved. * + * Author: Matthew Marks * * * * This program is free software; you can redistribute it and/or modify * *************** *** 551,555 **** /// Issue a stop command to all recorders. /// @param stopTimecode First frame in recording of postroll period. ! /// @param description Recording description. /// @param locators Locator information. void RecorderGroupCtrl::Stop(const ProdAuto::MxfTimecode & stopTimecode, const wxString & description, const ProdAuto::LocatorSeq & locators) --- 554,558 ---- /// Issue a stop command to all recorders. /// @param stopTimecode First frame in recording of postroll period. ! /// @param description Recording description (which is saved). /// @param locators Locator information. void RecorderGroupCtrl::Stop(const ProdAuto::MxfTimecode & stopTimecode, const wxString & description, const ProdAuto::LocatorSeq & locators) *************** *** 561,564 **** --- 564,568 ---- } } + mCurrentDescription = description; EnableForInput(); //do it here for safety (in case we get no response) *************** *** 621,622 **** --- 625,632 ---- return mCurrentProject; } + + /// Get the description sent at the end of each recording. + const wxString & RecorderGroupCtrl::GetCurrentDescription() + { + return mCurrentDescription; + } Index: player.cpp =================================================================== RCS file: /cvsroot/ingex/ingex/studio/ace-tao/Ingexgui/src/player.cpp,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** player.cpp 23 Jan 2009 19:46:40 -0000 1.8 --- player.cpp 29 Jan 2009 07:36:58 -0000 1.9 *************** *** 1,5 **** /*************************************************************************** ! * Copyright (C) 2006-2008 British Broadcasting Corporation * * - all rights reserved. * * * * This program is free software; you can redistribute it and/or modify * --- 1,8 ---- /*************************************************************************** ! * $Id$ * ! * * ! * Copyright (C) 2006-2009 British Broadcasting Corporation * * - all rights reserved. * + * Author: Matthew Marks * * * * This program is free software; you can redistribute it and/or modify * *************** *** 26,29 **** --- 29,37 ---- using namespace prodauto; //IngexPlayer class is in this namespace + /*************************************************************************** + * PLAYER * + ***************************************************************************/ + + BEGIN_EVENT_TABLE( Player, wxEvtHandler ) EVT_COMMAND( FRAME_DISPLAYED, wxEVT_PLAYER_MESSAGE, Player::OnFrameDisplayed ) *************** *** 32,41 **** EVT_COMMAND( PROGRESS_BAR_DRAG, wxEVT_PLAYER_MESSAGE, Player::OnProgressBarDrag ) EVT_TIMER( wxID_ANY, Player::OnFilePollTimer ) END_EVENT_TABLE() - //static Rational Zero = {0, 0}; - //static Rational Aspect = {4, 3}; - /// Creates the player, but does not display it. /// @param handler The handler where events will be sent. /// @param enabled True to enable player. --- 40,48 ---- EVT_COMMAND( PROGRESS_BAR_DRAG, wxEVT_PLAYER_MESSAGE, Player::OnProgressBarDrag ) EVT_TIMER( wxID_ANY, Player::OnFilePollTimer ) + EVT_SOCKET( wxID_ANY, Player::OnSocketEvent ) END_EVENT_TABLE() /// Creates the player, but does not display it. + /// Player must be deleted explicitly or a traffic control notification will be missed. /// @param handler The handler where events will be sent. /// @param enabled True to enable player. *************** *** 43,57 **** /// @param displayType The on screen display type. Player::Player(wxEvtHandler * handler, const bool enabled, const PlayerOutputType outputType, const OSDtype displayType) : ! LocalIngexPlayer(outputType), mOSDtype(displayType), mEnabled(enabled), mOK(false), mSpeed(0) //simple LocalIngexPlayer constructor with defaults { ! mListener = new Listener(this); //registers with the player mFilePollTimer = new wxTimer(this, wxID_ANY); SetNextHandler(handler); mDesiredTrackName = ""; //display the quad split by default } Player::~Player() { delete mListener; } --- 50,70 ---- /// @param displayType The on screen display type. Player::Player(wxEvtHandler * handler, const bool enabled, const PlayerOutputType outputType, const OSDtype displayType) : ! LocalIngexPlayer(&mListenerRegistry, outputType), mOSDtype(displayType), mEnabled(enabled), mOK(false), mSpeed(0), mMuted(false) //simple LocalIngexPlayer constructor with defaults { ! mListener = new Listener(this, &mListenerRegistry); //registers with the player mFilePollTimer = new wxTimer(this, wxID_ANY); SetNextHandler(handler); mDesiredTrackName = ""; //display the quad split by default + mSocket = new wxSocketClient(); + mSocket->SetEventHandler(*this); + mSocket->SetNotify(wxSOCKET_CONNECTION_FLAG); + TrafficControl(false); //in case it has just been restarted after crashing and leaving traffic control on } Player::~Player() { + TrafficControl(false, true); //must do this synchronously or the socket will be opened but the data will never be sent delete mListener; + delete mSocket; } *************** *** 87,90 **** --- 100,107 ---- mFilePollTimer->Stop(); //suspend any current attempts to load close(); //stops and closes window + if (mSpeed) { + mSpeed = 0; + TrafficControl(false); + } //clear the position display wxCommandEvent guiFrameEvent(wxEVT_PLAYER_MESSAGE, FRAME_DISPLAYED); *************** *** 110,113 **** --- 127,133 ---- std::vector<std::string> * fNames = fileNames ? fileNames : &mFileNames; Reset(); //otherwise it keeps showing what was there before even if it can't open any files + if (fileNames) { //New paths + mLastPlayingBackwards = false; //no point continuing the default play direction of the previous set of files + } if (fNames->size()) { //not a router recorder recording only, for instance if (mEnabled) { *************** *** 167,171 **** } mLastRequestedCuePoint = cuePoint; ! mMode = PAUSE; } bool allFilesOpen = false; --- 187,191 ---- } mLastRequestedCuePoint = cuePoint; ! mMode = PlayerMode::PAUSE; } bool allFilesOpen = false; *************** *** 180,184 **** inputs.push_back(input); } ! mOK = start(inputs, mOpened, PAUSE == mMode || STOP == mMode, mLastFrameDisplayed); //play forwards or paused int trackToSelect = 0; //display quad split by default if (mOK) { --- 200,204 ---- inputs.push_back(input); } ! mOK = start(inputs, mOpened, PlayerMode::PAUSE == mMode || PlayerMode::STOP == mMode, mLastFrameDisplayed); //play forwards or paused int trackToSelect = 0; //display quad split by default if (mOK) { *************** *** 187,191 **** markPosition(mCuePoints[i], 0); //so that an event is generated at each cue point } ! if (PLAY_BACKWARDS == mMode) { playSpeed(-1); } --- 207,211 ---- markPosition(mCuePoints[i], 0); //so that an event is generated at each cue point } ! if (PlayerMode::PLAY_BACKWARDS == mMode) { playSpeed(-1); } *************** *** 219,225 **** SelectTrack(trackToSelect, false); allFilesOpen = mOpened.size() == nFilesOpen; } else { ! setX11WindowName("Ingex Player - no files"); } //tell the track selection list the situation --- 239,246 ---- SelectTrack(trackToSelect, false); allFilesOpen = mOpened.size() == nFilesOpen; + muteAudio(mMuted); } else { ! SetWindowName(wxT("Ingex Player - no files")); } //tell the track selection list the situation *************** *** 239,243 **** //std::cerr << "Player Select Track" << std::endl; if (mOK) { ! std::string title; switchVideo(id); if (id) { //individual track --- 260,264 ---- //std::cerr << "Player Select Track" << std::endl; if (mOK) { ! wxString title; switchVideo(id); if (id) { //individual track *************** *** 245,249 **** mDesiredTrackName = mTrackNames[id - 1]; // -1 to offset for quad split } ! title = mTrackNames[id - 1]; } else { //quad split --- 266,270 ---- mDesiredTrackName = mTrackNames[id - 1]; // -1 to offset for quad split } ! title = wxString(mTrackNames[id - 1].c_str(), *wxConvCurrent); } else { //quad split *************** *** 254,258 **** for (size_t i = 0; i < mTrackNames.size(); i++) { //only go through video files if (mOpened[i]) { ! title += mTrackNames[i] + "; "; if (4 == ++nTracks) { //Quad Split displays the first four successfully opened files --- 275,279 ---- for (size_t i = 0; i < mTrackNames.size(); i++) { //only go through video files if (mOpened[i]) { ! title += wxString(mTrackNames[i].c_str(), *wxConvCurrent) + wxT("; "); if (4 == ++nTracks) { //Quad Split displays the first four successfully opened files *************** *** 261,300 **** } } ! if (title.size()) { //trap for only audio files title.resize(title.size() - 2); //remove trailing semicolon and space } } ! //add player type ! if (X11_OUTPUT == getActualOutputType() || DUAL_DVS_X11_OUTPUT == getActualOutputType()) { ! title += " (unaccelerated)"; ! } ! setX11WindowName(title.c_str()); } } ... [truncated message content] |