Home > APIs > AppServer API > Examples > Timeline and Transport Control > Create a Basic Playlist
Below is example C# and C++ code for creating a basic playlist. This playlist has two sections that each contain two events. See Playlists, Sections, and Events for an explanation on playlists.
A C# sample script can also be found on the C# Scripts Sample page.
[C#]
// create a two-head player recorder
bool isNewController = false;
ITwoHeadPlayerRecorder player = (ITwoHeadPlayerRecorder) appServer.CreateController(
"YourApplicationName", "C1", out isNewController);
// set loop play mode to false
player.LoopPlayMode = false;
// enable list pauses
player.SetChannelProperty("listpauses", "true");
// enable list repeats
player.SetChannelProperty("listrepeats", "true");
// set current bin
player.SetCurrentBin("V:", "default");
// generate a unique name for the playlist (i.e. playlist, playlist_0, etc.)
string playlist = player.GenerateUniqueName ("playlist", "_");
// eject the play first to make sure we're clean
player.Eject();
// generate a new clip name (which also loads it)
player.New(playlist);
// get the editor
IEventEditor editor = (IEventEditor) player.GetEditor();
// insert the first section
string section1 = editor.InsertSection("");
// set the starting timecode
editor.SetStartingTimecode("01:00:00,00");
// insert several play events and get properties back
string editID_A = editor.InsertPlayEvent(@"edl/cmf//local/V:/default/ClipA", section1, 0, "");
object[] array = (object[]) editor.GetEventProperty (editID_A, "name+startpos+duration");
// your code to do something with event properties
string editID_B = editor.InsertPlayEvent(@"edl/cmf//local/V:/default/ClipB", section1, 0, "");
array = (object[]) editor.GetEventProperty (editID_B, "name+startpos+duration");
// your code to do something with event properties
// insert another section
string section2 = editor.InsertSection("");
// insert several more play events and get properties back
string editID_C = editor.InsertPlayEvent(@"edl/cmf//local/V:/default/ClipC", section2, 0, "");
array = (object[]) editor.GetEventProperty (editID_C, "name+startpos+duration");
// your code to do something with event properties
string editID_D = editor.InsertPlayEvent(@"edl/cmf//local/V:/default/ClipD", section2, 0, "");
array = (object[]) editor.GetEventProperty (editID_D, "name+startpos+duration");
// your code to do something with event properties
// play the list for awhile
player.Play();
Thread.Sleep(30000);
player.Stop();
// delete events
editor.DeleteEvent(editID_C);
editor.DeleteEvent(editID_D);
// delete section 2
editor.DeleteSection(section2);
// note: you cannot delete all sections. Since this is a playlist
// it will force you to keep at least one section in it.
// editor.DeleteSection(section2); // this would error
// eject the clip
player.Eject();
// close the channel
player.CloseChannel();
// cleanup
editor.Detach();
[C++]
short nIsNewController;
ISimpleControllerPtr spController;
_variant_t varChanNum(m_bstrChannel);
// create the controller and cast it to different interfaces
HRESULT hr = spAppServer->CreateController(_bstr_t("YourApplicationName"), _bstr_t("C1"),
&nIsNewController, &spController);
//printf("CreateController hresult = 0x%x\n", hr);
ISimplePlayerRecorderPtr spPlayer = (ISimplePlayerRecorderPtr) spController;
ITwoHeadPlayerRecorderPtr spTwoHeadPlayer = (ITwoHeadPlayerRecorderPtr) spController;
// set loop play mode to false
VARIANT_BOOL loopmode(FALSE);
hr = spPlayer->put_LoopPlayMode(loopmode);
// enable list pauses
hr = spController->SetChannelProperty(_bstr_t("listpauses"), _variant_t("true"));
// enable list repeats
hr = spController->SetChannelProperty(_bstr_t("listrepeats"), _variant_t("true"));
// set current bin
hr = spController->SetCurrentBin(_bstr_t("V:"), _bstr_t("default"));
// generate a unique name for the playlist (i.e. playlist, playlist_0, etc.)
BSTR playlist;
hr = spController->GenerateUniqueName (_bstr_t("playlist"), _bstr_t("_"), &playlist);
// eject the play first to make sure we're clean
hr = spPlayer->Eject();
// create the new playlist (which also loads it)
hr = spPlayer->New(playlist);
// get an editor and cast it to an event editor
ISimpleEditorPtr spEditor;
hr = spPlayer->GetEditor(&spEditor);
IEventEditorPtr spEventEditor = (IEventEditorPtr) spEditor;
// insert the first section
BSTR section1;
hr = spEventEditor->InsertSection(_bstr_t(""), §ion1);
// set the default starting timecode (this is what AppCenter does).
spEditor->SetStartingTimecode(_variant_t("01:00:00,00"));
// insert several play events and get properties back
BSTR editID_A;
VARIANT varResult;
hr = spEventEditor->InsertPlayEvent(_bstr_t("edl/cmf//local/V:/default/ClipA"), section1, 0, _bstr_t(""), &editID_A);
hr = spEventEditor->GetEventProperty (editID_A, _bstr_t("name+startpos+duration"), &varResult);
// your code to do something with event properties
BSTR editID_B;
hr = spEventEditor->InsertPlayEvent(_bstr_t("edl/cmf//local/V:/default/ClipB"), section1, 0, _bstr_t(""), &editID_B);
hr = spEventEditor->GetEventProperty (editID_B, _bstr_t("name+startpos+duration"), &varResult);
// your code to do something with event properties
// insert another section
BSTR section2;
hr = spEventEditor->InsertSection(_bstr_t(""), §ion2);
// insert several more play events and get properties back
BSTR editID_C;
hr = spEventEditor->InsertPlayEvent(_bstr_t("edl/cmf//local/V:/default/ClipA"), section1, 0, _bstr_t(""), &editID_C);
hr = spEventEditor->GetEventProperty (editID_C, _bstr_t("name+startpos+duration"), &varResult);
// your code to do something with event properties
BSTR editID_D;
hr = spEventEditor->InsertPlayEvent(_bstr_t("edl/cmf//local/V:/default/ClipB"), section1, 0, _bstr_t(""), &editID_D);
hr = spEventEditor->GetEventProperty (editID_D, _bstr_t("name+startpos+duration"), &varResult);
// your code to do something with event properties
// play for awhile
hr = spPlayer->Play();
Sleep(30000);
// eject
hr = spPlayer->Eject();
// close channel
hr = spController->CloseChannel();
// cleanup
hr = spEditor->Detach();
