SongList PLSParser::Load(QIODevice *device, const QString& playlist_path, const QDir &dir) const { QMap<int, Song> songs; QRegExp n_re("\\d+$"); while (!device->atEnd()) { QString line = QString::fromUtf8(device->readLine()).trimmed(); int equals = line.indexOf('='); QString key = line.left(equals).toLower(); QString value = line.mid(equals + 1); n_re.indexIn(key); int n = n_re.cap(0).toInt(); if (key.startsWith("file")) { Song song = LoadSong(value, 0, dir); // Use the title and length we've already loaded if any if (!songs[n].title().isEmpty()) song.set_title(songs[n].title()); if (!songs[n].length_nanosec() != -1) song.set_length_nanosec(songs[n].length_nanosec()); songs[n] = song; } else if (key.startsWith("title")) { songs[n].set_title(value); } else if (key.startsWith("length")) { qint64 seconds = value.toLongLong(); if (seconds > 0) { songs[n].set_length_nanosec(seconds * kNsecPerSec); } } } return songs.values(); }
void WplParser::ParseSeq(const QDir& dir, QXmlStreamReader* reader, SongList* songs) const { while (!reader->atEnd()) { QXmlStreamReader::TokenType type = reader->readNext(); switch (type) { case QXmlStreamReader::StartElement: { QStringRef name = reader->name(); if (name == "media") { QStringRef src = reader->attributes().value("src"); if (!src.isEmpty()) { Song song = LoadSong(src.toString(), 0, dir); if (song.is_valid()) { songs->append(song); } } } else { Utilities::ConsumeCurrentElement(reader); } break; } case QXmlStreamReader::EndElement: { if (reader->name() == "seq") { return; } break; } default: break; } } }
void MainScreen::become_front() { InterfaceScreen::become_front(); if (Preferences::preferences()->play_idle_music() && !SongIsPlaying()) { LoadSong(kTitleSongID); SetSongVolume(kMaxMusicVolume); PlaySong(); } }
void CSound::PlaySong (ESong Song) { bool result = true; // If the sound works if (m_SoundOK) { // If a song exists free it unless it is the same if (m_CurrentSong != NULL && m_ESong != Song) FreeSong(Song); // note: songs are loaded dynamically because of an error in libmikmod (used by SDL_mixer) // load new song (if necessary) if (m_ESong != Song || m_CurrentSong == NULL) { switch (Song) { case SONG_MATCH_MUSIC_1_NORMAL: result = LoadSong (SONG_MATCH_MUSIC_1_NORMAL , SND_MATCH_MUSIC_1_NORMAL); break; case SONG_MATCH_MUSIC_1_FAST: result = LoadSong (SONG_MATCH_MUSIC_1_FAST , SND_MATCH_MUSIC_1_FAST ); break; case SONG_MENU_MUSIC: result = LoadSong (SONG_MENU_MUSIC , SND_MENU_MUSIC ); break; case SONG_CONTROLS_MUSIC: result = LoadSong (SONG_CONTROLS_MUSIC , SND_CONTROLS_MUSIC ); break; case SONG_TITLE_MUSIC: result = LoadSong (SONG_TITLE_MUSIC , SND_TITLE_MUSIC ); break; default: result = false; } } if (result) { // Start playing this song (-1 infinite loop) Mix_PlayMusic(m_CurrentSong, -1); m_ESong = Song; } } }
SongList M3UParser::Load(QIODevice* device, const QString& playlist_path, const QDir& dir) const { SongList ret; M3UType type = STANDARD; Metadata current_metadata; QString data = QString::fromUtf8(device->readAll()); data.replace('\r', '\n'); data.replace("\n\n", "\n"); QByteArray bytes = data.toUtf8(); QBuffer buffer(&bytes); buffer.open(QIODevice::ReadOnly); QString line = QString::fromUtf8(buffer.readLine()).trimmed(); if (line.startsWith("#EXTM3U")) { // This is in extended M3U format. type = EXTENDED; line = QString::fromUtf8(buffer.readLine()).trimmed(); } forever { if (line.startsWith('#')) { // Extended info or comment. if (type == EXTENDED && line.startsWith("#EXT")) { if (!ParseMetadata(line, ¤t_metadata)) { qLog(Warning) << "Failed to parse metadata: " << line; } } } else if (!line.isEmpty()) { Song song = LoadSong(line, 0, dir); if (!current_metadata.title.isEmpty()) { song.set_title(current_metadata.title); } if (!current_metadata.artist.isEmpty()) { song.set_artist(current_metadata.artist); } if (current_metadata.length > 0) { song.set_length_nanosec(current_metadata.length); } ret << song; current_metadata = Metadata(); } if (buffer.atEnd()) { break; } line = QString::fromUtf8(buffer.readLine()).trimmed(); } return ret; }
Song XSPFParser::ParseTrack(QXmlStreamReader* reader, const QDir& dir) const { QString title, artist, album, location; qint64 nanosec = -1; while (!reader->atEnd()) { QXmlStreamReader::TokenType type = reader->readNext(); switch (type) { case QXmlStreamReader::StartElement: { QStringRef name = reader->name(); if (name == "location") { location = reader->readElementText(); } else if (name == "title") { title = reader->readElementText(); } else if (name == "creator") { artist = reader->readElementText(); } else if (name == "album") { album = reader->readElementText(); } else if (name == "duration") { // in milliseconds. const QString duration = reader->readElementText(); bool ok = false; nanosec = duration.toInt(&ok) * kNsecPerMsec; if (!ok) { nanosec = -1; } } else if (name == "image") { // TODO: Fetch album covers. } else if (name == "info") { // TODO: Do something with extra info? } break; } case QXmlStreamReader::EndElement: { if (reader->name() == "track") { goto return_song; } } default: break; } } return_song: Song song = LoadSong(location, 0, dir); // Override metadata with what was in the playlist song.set_title(title); song.set_artist(artist); song.set_album(album); song.set_length_nanosec(nanosec); return song; }
SongList AsxIniParser::Load(QIODevice* device, const QString& playlist_path, const QDir& dir) const { SongList ret; while (!device->atEnd()) { QString line = QString::fromUtf8(device->readLine()).trimmed(); int equals = line.indexOf('='); QString key = line.left(equals).toLower(); QString value = line.mid(equals + 1); if (key.startsWith("ref")) { Song song = LoadSong(value, 0, dir); if (song.is_valid()) { ret << song; } } } return ret; }
void ScrollTextScreen::become_front() { // If a song was requested, play it. if (_play_song && Preferences::preferences()->play_idle_music()) { if (SongIsPlaying()) { StopAndUnloadSong(); } LoadSong(_song_id); SetSongVolume(kMaxMusicVolume); PlaySong(); } _start = now_usecs(); _next_shift = _start; _clip = Rect(0, 0, world.width(), kScrollTextHeight); _clip.center_in(world); _position = _build_pix.size().as_rect(); _position.center_in(_clip); _position.offset(0, _clip.bottom - _position.top); }
Song ASXParser::ParseTrack(QXmlStreamReader* reader, const QDir& dir) const { QString title, artist, album, ref; while (!reader->atEnd()) { QXmlStreamReader::TokenType type = reader->readNext(); switch (type) { case QXmlStreamReader::StartElement: { QStringRef name = reader->name(); if (name == "ref") { ref = reader->attributes().value("href").toString(); } else if (name == "title") { title = reader->readElementText(); } else if (name == "author") { artist = reader->readElementText(); } break; } case QXmlStreamReader::EndElement: { if (reader->name() == "entry") { goto return_song; } break; } default: break; } } return_song: Song song = LoadSong(ref, 0, dir); // Override metadata with what was in the playlist song.set_title(title); song.set_artist(artist); song.set_album(album); return song; }
SWBOOL PlaySong(char *song_file_name, int cdaudio_track, SWBOOL loop, SWBOOL restart) { if (!gs.MusicOn) { return FALSE; } if (DemoMode) return FALSE; if (!restart) { if (SongType == SongTypeWave) { if (SongTrack > 0 && SongTrack == cdaudio_track) { // ogg replacement for a CD track return TRUE; } else if (SongName && song_file_name && !strcmp(SongName, song_file_name)) { return TRUE; } } else if (SongType == SongTypeMIDI) { if (SongName && song_file_name && !strcmp(SongName, song_file_name)) { return TRUE; } } } StopSong(); if (!SW_SHAREWARE) { if (cdaudio_track >= 0) { char waveformtrack[MAXWAVEFORMTRACKLENGTH]; Bstrncpy(waveformtrack, gs.WaveformTrackName, MAXWAVEFORMTRACKLENGTH - 1); char *numPos = Bstrstr(waveformtrack, "??"); if (numPos && (numPos-waveformtrack) < MAXWAVEFORMTRACKLENGTH - 2) { static const char *tracktypes[] = { ".flac", ".ogg" }; const size_t tracknamebaselen = Bstrlen(waveformtrack); size_t i; numPos[0] = '0' + (cdaudio_track / 10) % 10; numPos[1] = '0' + cdaudio_track % 10; for (i = 0; i < ARRAY_SIZE(tracktypes); ++i) { waveformtrack[tracknamebaselen] = '\0'; Bstrncat(waveformtrack, tracktypes[i], MAXWAVEFORMTRACKLENGTH); if (LoadSong(waveformtrack)) { SongVoice = FX_PlayLoopedAuto(SongPtr, SongLength, 0, 0, 0, 255, 255, 255, FX_MUSIC_PRIORITY, MUSIC_ID); if (SongVoice > FX_Ok) { SongType = SongTypeWave; SongTrack = cdaudio_track; SongName = Bstrdup(waveformtrack); return TRUE; } } } buildprintf("Can't find CD track %i!\n", cdaudio_track); } else { buildprintf("Make sure to have \"??\" as a placeholder for the track number in your WaveformTrackName!\n"); buildprintf(" e.g. WaveformTrackName = \"MUSIC/Track??\"\n"); } } } if (!song_file_name || !LoadSong(song_file_name)) { return FALSE; } if (!memcmp(SongPtr, "MThd", 4)) { MUSIC_PlaySong(SongPtr, /*SongLength,*/ MUSIC_LoopSong); SongType = SongTypeMIDI; SongName = strdup(song_file_name); return TRUE; } else { SongVoice = FX_PlayLoopedAuto(SongPtr, SongLength, 0, 0, 0, 255, 255, 255, FX_MUSIC_PRIORITY, MUSIC_ID); if (SongVoice > FX_Ok) { SongType = SongTypeWave; SongName = strdup(song_file_name); return TRUE; } } return FALSE; }
struct Root *LoadRoot(void){ static char *objs[1]={ "SONG" }; static char *vars[14]={ "def_instrument", "curr_block", "tempo", "lpb", "signature_numerator", "signature_denominator", "quantitize", "quantitize_numerator", "quantitize_denominator", "grid_numerator", "grid_denominator", "keyoct", "min_standardvel", "standardvel" }; struct Root *ret=DC_alloc(sizeof(struct Root)); ret->quantitize_options = root->quantitize_options; ret->scrollplayonoff=true; ret->min_standardvel=MAX_VELOCITY*40/100; ret->editonoff=true; ret->grid_numerator=1; ret->grid_denominator=1; ret->signature.numerator=4; ret->signature.denominator=4; GENERAL_LOAD(1,14); obj0: ret->song=LoadSong(); goto start; var0: goto start; // Don't bother with instruments yet. var1: ret->curr_block=DC_LoadN(); goto start; var2: ret->tempo=DC_LoadI(); goto start; var3: ret->lpb=DC_LoadI(); goto start; var4: ret->signature.numerator=DC_LoadI(); goto start; var5: ret->signature.denominator=DC_LoadI(); goto start; var6: DC_LoadF(); goto start; var7: ret->quantitize_options.quant.numerator = DC_LoadI(); goto start; var8: ret->quantitize_options.quant.denominator = DC_LoadI(); goto start; var9: ret->grid_numerator=DC_LoadI(); goto start; var10: ret->grid_denominator=DC_LoadI(); goto start; var11: ret->keyoct=DC_LoadI(); goto start; var12: ret->min_standardvel=DC_LoadI(); goto start; var13: ret->standardvel=DC_LoadI(); goto start; var14: var15: var16: var17: var18: var19: var20: obj1: obj2: obj3: obj4: obj5: obj6: debug("loadroot, very wrong\n"); error: debug("loadroot, goto error\n"); end: return ret; }
Song ParserBase::LoadSong(const QString& filename_or_url, qint64 beginning, const QDir& dir) const { Song song; LoadSong(filename_or_url, beginning, dir, &song); return song; }