playlist.cpp
字号:
if(currentItem && key >= kPlaylistSortKey_FirstKey && key < kPlaylistSortKey_LastKey)
{
if(type == kPlaylistSortType_Ascending)
stable_sort(m_activeList->begin(), m_activeList->end(), PlaylistItemSort(key));
else
stable_sort(m_activeList->begin(), m_activeList->end(), not2(PlaylistItemSort(key)));
m_sortKey = key;
m_sortType = type;
result = kError_NoErr;
}
else if(currentItem && key == kPlaylistSortKey_Random)
{
pointer_to_unary_function<int, int> lRand =
pointer_to_unary_function<int, int>(my_rand);
random_shuffle(m_activeList->begin(), m_activeList->end(), lRand);
m_sortKey = key;
m_sortType = type;
result = kError_NoErr;
}
if(IsntError(result))
{
if(kPlaylistKey_MasterPlaylist == GetActivePlaylist())
InternalSetCurrentIndex(IndexOf(currentItem));
m_context->target->AcceptEvent(new PlaylistSortedEvent(key, this));
//m_undo.Clear();
}
m_mutex.Release();
return result;
}
PlaylistSortKey PlaylistManager::GetPlaylistSortKey() const
{
return m_sortKey;
}
PlaylistSortType PlaylistManager::GetPlaylistSortType() const
{
return m_sortType;
}
// Which playlist are we dealing with for purposes of editing:
// 1) Master Playlist - list of songs to play
// 2) Secondary Playlist - a playlist that we want to edit
// - External playlist
// - Portable playlist
Error PlaylistManager::SetActivePlaylist(PlaylistKey key)
{
Error result = kError_InvalidParam;
m_mutex.Acquire();
if(key >= kPlaylistKey_FirstKey && key < kPlaylistKey_LastKey)
{
m_playlistKey = key;
result = kError_NoErr;
switch(key)
{
case kPlaylistKey_MasterPlaylist:
{
m_activeList = &m_masterList;
break;
}
case kPlaylistKey_ExternalPlaylist:
{
m_activeList = &m_externalList;
break;
}
case kPlaylistKey_PortablePlaylist:
{
//m_activeList = &m_portableList;
m_activeList = &m_externalList;
break;
}
default:
{
result = kError_InvalidParam;
}
}
}
m_mutex.Release();
return result;
}
PlaylistKey PlaylistManager::GetActivePlaylist() const
{
return m_playlistKey;
}
Error PlaylistManager::SetExternalPlaylist(char* url)
{
Error result = kError_InvalidParam;
m_mutex.Acquire();
assert(url);
if(url)
{
// first delete old playlist
uint32 index = 0;
uint32 numItems = 0;
PlaylistItem* item = NULL;
numItems = m_externalList.size();
for(index = 0; index < numItems; index++)
{
item = m_externalList[index];
if(item)
{
// if the metadata thread is still accessing this item
// we don't wanna delete the item out from under it.
// instead we set a flag and let the metadata thread
// clean up when it returns.
if(item->GetState() == kPlaylistItemState_RetrievingMetaData)
{
item->SetState(kPlaylistItemState_Delete);
}
else
{
delete item;
}
}
}
m_externalList.clear();
result = ReadPlaylist(url, &m_externalList);
vector<PlaylistItem*>* items = new vector<PlaylistItem*>;
items->insert(items->end(),
m_externalList.begin(),
m_externalList.end());
RetrieveMetaData(items);
}
m_mutex.Release();
return result;
}
Error PlaylistManager::GetExternalPlaylist(char* url, uint32* length)
{
Error result = kError_InvalidParam;
m_mutex.Acquire();
assert(url);
assert(length);
if(url && length)
{
if(*length >= m_externalPlaylist.size() + 1)
{
strcpy(url, m_externalPlaylist.c_str());
result = kError_NoErr;
}
else
{
result = kError_BufferTooSmall;
}
*length = m_externalPlaylist.size() + 1;
}
m_mutex.Release();
return result;
}
Error PlaylistManager::SetPortablePlaylist(DeviceInfo* device,
PLMCallBackFunction function,
void* cookie)
{
Error result = kError_InvalidParam;
assert(device);
if(device)
{
result = ReadPortablePlaylist(device, NULL, function, cookie);
m_portableDevice = *device;
}
return result;
}
Error PlaylistManager::GetPortablePlaylist(DeviceInfo* device)
{
Error result = kError_InvalidParam;
assert(device);
if(device)
{
result = kError_NoErr;
*device = m_portableDevice;
}
return result;
}
// External playlist support
bool PlaylistManager::IsSupportedPlaylistFormat(const char *extension)
{
bool retvalue = false;
uint32 numFormats = m_playlistFormats.size();
for(uint32 index = 0; index < numFormats; index++)
{
PlaylistFormatInfo* format = m_playlistFormats[index];
if(!strcasecmp(extension, format->GetExtension()))
{
retvalue = true;
break;
}
}
return retvalue;
}
Error PlaylistManager::GetSupportedPlaylistFormats(PlaylistFormatInfo* format,
uint32 index)
{
Error result = kError_InvalidParam;
assert(format);
if(format)
{
result = kError_NoMoreFormats;
uint32 numFormats = m_playlistFormats.size();
if(index < numFormats)
{
result = kError_NoErr;
*format = *m_playlistFormats[index];
}
}
return result;
}
Error PlaylistManager::ReadPlaylist(const char* url,
vector<PlaylistItem*>* items,
PLMCallBackFunction function,
void* cookie)
{
Error result = kError_InvalidParam;
assert(url);
if(url)
{
// find a suitable plugin
result = kError_FormatNotSupported;
char* extension = strrchr(url, '.');
if(extension)
{
extension++;
uint32 numFormats = m_playlistFormats.size();
for(uint32 index = 0; index < numFormats; index++)
{
PlaylistFormatInfo* format = m_playlistFormats[index];
if(!strcasecmp(extension, format->GetExtension()))
{
bool addToActiveList = false;
if(!items)
{
items = new vector<PlaylistItem*>;
addToActiveList = true;
}
result = format->GetRef()->ReadPlaylist(url,
items,
function,
cookie);
if(addToActiveList)
{
AddItems(items);
delete items;
}
break;
}
}
}
}
return result;
}
Error PlaylistManager::WritePlaylist(const char* url,
PlaylistFormatInfo* format,
vector<PlaylistItem*>* items,
PLMCallBackFunction function,
void* cookie)
{
Error result = kError_InvalidParam;
assert(url);
assert(format);
if(url && format)
{
if(!items)
{
items = m_activeList;
}
result = format->GetRef()->WritePlaylist(url,
format,
items,
function,
cookie);
}
return result;
}
Error PlaylistManager::WritePlaylist(const char* url,
vector<PlaylistItem*>* items,
PLMCallBackFunction function,
void* cookie)
{
Error result = kError_InvalidParam;
assert(url);
if(url)
{
// find a suitable plugin
result = kError_FormatNotSupported;
char* extension = strrchr(url, '.');
if(extension)
{
extension++;
uint32 numFormats = m_playlistFormats.size();
for(uint32 index = 0; index < numFormats; index++)
{
PlaylistFormatInfo* format = m_playlistFormats[index];
if(!strcasecmp(extension, format->GetExtension()))
{
if(!items)
{
items = m_activeList;
}
result = format->GetRef()->WritePlaylist(url,
format,
items,
function,
cookie);
break;
}
}
}
}
return result;
}
// Portable player communication
Error PlaylistManager::GetSupportedPortables(DeviceInfo* device, uint32 index)
{
Error result = kError_InvalidParam;
assert(device);
if(device)
{
result = kError_NoMoreDevices;
uint32 numDevices = m_portablePlayers.size();
if(index < numDevices)
{
result = kError_NoErr;
*device = *m_portablePlayers[index];
}
}
return result;
}
bool PlaylistManager::IsPortableAvailable(DeviceInfo* device)
{
bool result = false;
assert(device);
if(device)
{
result = device->GetRef()->IsDeviceAvailable(device);
}
return result;
}
Error PlaylistManager::GetDeviceInfo(DeviceInfo* device)
{
Error result = kError_InvalidParam;
assert(device);
if(device)
{
result = device->GetRef()->GetDeviceInfo(device);
}
return result;
}
Error PlaylistManager::InitializeDevice(DeviceInfo* device,
PLMCallBackFunction function,
void* cookie)
{
Error result = kError_InvalidParam;
assert(device);
if(device)
{
result = device->GetRef()->InitializeDevice(device, function, cookie);
}
return result;
}
Error PlaylistManager::ReadPortablePlaylist(DeviceInfo* device,
vector<PlaylistItem*>* items,
PLMCallBackFunction function,
void* cookie)
{
Error result = kError_InvalidParam;
assert(device);
if(device)
{
// first delete old playlist
if(!items)
{
uint32 index = 0;
uint32 numItems = 0;
PlaylistItem* item = NULL;
numItems = m_externalList.size();
for(index = 0; index < numItems; index++)
{
item = m_externalList[index];
if(item)
{
// if the metadata thread is still accessing this item
// we don't wanna delete the item out from under it.
// instead we set a flag and let the metadata thread
// clean up when it returns.
if(item->GetState() == kPlaylistItemState_RetrievingMetaData)
{
item->SetState(kPlaylistItemState_Delete);
}
else
{
delete item;
}
}
}
}
bool addToActiveList = false;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -