playlist.cpp
来自「Amarok是一款在LINUX或其他类UNIX操作系统中运行的音频播放器软件。 」· C++ 代码 · 共 307 行
CPP
307 行
/*************************************************************************** playlist.cpp - description ------------------- begin : 2001-07-24 copyright : (C) 2001 by Shaun Jackman (sjackman@debian.org) modify by: : Andres Oton email : andres.oton@gmail.com ***************************************************************************//*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/#include "debug.h"// kionjb#include "njbmediadevice.h"#include "playlist.h"#define NJB_SUCCESS 0#define NJB_FAILURE -1// KDE#include <kdebug.h>using namespace KIO;// POSIX#include <stdlib.h>NjbPlaylist::NjbPlaylist(){ m_playlist = NJB_Playlist_New(); if( !m_playlist) debug() << "putPlaylist: playlist_new failed\n";}NjbPlaylist::NjbPlaylist(njb_playlist_t* playlist): m_playlist(0){ // debug() << __PRETTY_FUNCTION__ << " this=" << this << " playlist=" << playlist << endl; setPlaylist( playlist );}NjbPlaylist::NjbPlaylist(const NjbPlaylist& _copy): m_playlist(0){ // debug() << __PRETTY_FUNCTION__ << " this=" << this << " m_playlist=" << m_playlist << " playlist=" << _copy.m_playlist << endl; setPlaylist( _copy.m_playlist );}NjbPlaylist::~NjbPlaylist( void){ // debug() << __PRETTY_FUNCTION__ << " this=" << this << " m_playlist=" << m_playlist << endl; if ( m_playlist ) NJB_Playlist_Destroy( m_playlist);}voidNjbPlaylist::operator=( const NjbPlaylist& _copy){ // debug() << __PRETTY_FUNCTION__ << " this=" << this << " m_playlist " << m_playlist << " playlist=" << _copy.m_playlist << endl; setPlaylist( _copy.m_playlist );}voidNjbPlaylist::setPlaylist( njb_playlist_t* _newlist ){ // debug() << __PRETTY_FUNCTION__ << " this=" << this << endl; // // This function copys the new playlist BY VALUE over our current list. // It's needed so that objects of this class can be stored in a QValueList // // First, kill the existing list if ( m_playlist ) { NJB_Playlist_Destroy( m_playlist); } // Get a new one m_playlist = NJB_Playlist_New(); // Set the name NJB_Playlist_Set_Name( m_playlist, _newlist->name ); // Set the id m_playlist->plid = _newlist->plid; // Iterate through the new list NJB_Playlist_Reset_Gettrack( _newlist ); njb_playlist_track_t* track = NJB_Playlist_Gettrack( _newlist ); while ( track ) { // Add a new playlist track to our list NJB_Playlist_Addtrack( m_playlist, NJB_Playlist_Track_New( track->trackid ), NJB_PL_END ); // And move on... track = NJB_Playlist_Gettrack( _newlist ); } debug() << __PRETTY_FUNCTION__ << " OK" << endl;}QStringNjbPlaylist::unescapefilename( const QString& _in ){ QString result = _in; result.replace("%2f","/"); return result;}QStringNjbPlaylist::escapefilename( const QString& _in ){ QString result = _in; result.replace("/","%2f"); return result;}intNjbPlaylist::setName( const QString& fileName){ QString playlistName = fileName; if( fileName.right( 4) == ".m3u") playlistName.truncate( playlistName.length() - 4); /* char** result; int nrow, ncolumn; char* errmsg; sqlite_get_table_printf( m_kionjb->m_db, "SELECT id FROM playlists WHERE name='%q'", &result, &nrow, &ncolumn, &errmsg, playlistName.latin1()); if( errmsg) { m_kionjb->warning( errmsg); free( errmsg); return ERR_COULD_NOT_READ; } if( nrow) { m_playlist->_state = NJB_PL_CHTRACKS; m_playlist->plid = atoi( result[ 1]); } else { m_playlist->_state = NJB_PL_NEW; m_playlist->plid = 0; } if( playlist_set_name( m_playlist, playlistName) == -1) { debug() << "putPlaylist: playlist_set_name failed\n"; return ERR_COULD_NOT_WRITE; }*/ if ( NJB_Playlist_Set_Name( m_playlist, unescapefilename(fileName).latin1() ) == NJB_FAILURE ) { debug() << __PRETTY_FUNCTION__ << ": NJB_Playlist_Set_Name failed\n"; return ERR_COULD_NOT_WRITE; } return NJB_SUCCESS;}intNjbPlaylist::addTrack( const QString& fileName){ debug() << __PRETTY_FUNCTION__ << " filename=" << fileName << endl;/* trackValueList::const_iterator it_track = theTracks->findTrackByName( fileName ); if( it_track == theTracks->end() ) { // couldn't find this track, skip it debug() << "putPlaylist: couldn't find " << fileName << endl; return NJB_FAILURE; } njb_playlist_track_t* pl_track = NJB_Playlist_Track_New( (*it_track)->id()); if( !pl_track) { debug() << "putPlaylist: playlist_track_new failed\n"; return ERR_COULD_NOT_WRITE; } NJB_Playlist_Addtrack( m_playlist, pl_track, NJB_PL_END);*/ return NJB_SUCCESS;}voidplaylist_dump( njb_playlist_t* playlist ){ debug() << __PRETTY_FUNCTION__ << endl; debug() << "name: " << playlist->name << endl; debug() << "state: " << playlist->_state << endl; debug() << "ntracks: " << playlist->ntracks << endl; debug() << "plid: " << playlist->plid << endl; NJB_Playlist_Reset_Gettrack( playlist ); njb_playlist_track_t* track = NJB_Playlist_Gettrack( playlist ); while ( track ) { debug() << "track: " << track->trackid << endl; track = NJB_Playlist_Gettrack( playlist ); } debug() << __PRETTY_FUNCTION__ << " done" << endl;}intNjbPlaylist::update( void){ // debug() << "putPlaylist: state = " << m_playlist->_state << endl; // debug() << "putPlaylist: id = " << m_playlist->plid << endl; debug() << "putPlaylist: sending...\n"; playlist_dump( m_playlist ); int status = NJB_Update_Playlist( NjbMediaDevice::theNjb(), m_playlist); if( status == -1) { debug() << "putPlaylist: NJB_Update_Playlist failed\n"; if (NJB_Error_Pending(NjbMediaDevice::theNjb())) { const char* error; while ((error = NJB_Error_Geterror(NjbMediaDevice::theNjb()))) kdError( 7182) << __func__ << ": " << error << endl; } else debug() << __func__ << ": No reason for failure reported.\n"; return ERR_COULD_NOT_WRITE; } return NJB_SUCCESS;}QStringListNjbPlaylist::trackNames( void ) const{ QStringList result;/* // find tracks in trackList by their ID MetaBundle bundle; NjbTrack track; njb_playlist_track_t *it_pltrack = m_playlist->first; while ( it_pltrack) { trackValueList::const_iterator it_track = theTracks->findTrackById( it_pltrack->trackid ); if ( it_track != theTracks->end() ) {// result += it_track.item().bundle()->title(); } it_pltrack = it_pltrack->next; }*/ return result;}boolNjbPlaylist::operator==(const QString& name) const{ return escapefilename(m_playlist->name) == name;}boolNjbPlaylist::operator==(const NjbPlaylist& rval) const{ return getName() == rval.getName();}QStringNjbPlaylist::getName(void) const{ debug() << __PRETTY_FUNCTION__ << " this=" << this << " list=" << m_playlist << endl; return escapefilename(m_playlist->name);}/* ------------------------------------------------------------------------ *//** Transfer playlists info from the njb to a local structure */intplaylistValueList::readFromDevice( void){ // ONLY read from the device if this list is empty. int playlists = 0; NJB_Reset_Get_Playlist( NjbMediaDevice::theNjb()); while( njb_playlist_t* pl = NJB_Get_Playlist( NjbMediaDevice::theNjb()) ) { // FIXME (acejones) Make this a signal // infoMessage( i18n( "Downloading playlist %1...").arg( ++playlists)); ++playlists; append( NjbPlaylist(pl)); NJB_Playlist_Destroy( pl); } debug() << __func__ << ": cached " << playlists << " playlist(s)\n"; return NJB_SUCCESS;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?