LocalMediaStream::LocalMediaStream(const talk_base::scoped_refptr<webrtc::LocalMediaStreamInterface>& pStream) : FB::JSAPIAuto("MediaStream") , m_label(pStream->label()) , m_videoTracks(FB::variant_list_of()) , m_audioTracks(FB::variant_list_of()) { registerProperty("label", make_property(this, &LocalMediaStream::get_label)); registerProperty("videoTracks", make_property(this,&LocalMediaStream::get_videoTracks)); registerProperty("audioTracks", make_property(this, &LocalMediaStream::get_audioTracks)); for(int i=0; i<pStream->video_tracks()->count(); i++) { talk_base::scoped_refptr<webrtc::VideoTrackInterface> pTrack(pStream->video_tracks()->at(i)); talk_base::scoped_refptr<webrtc::LocalVideoTrackInterface> pTrack_( static_cast<webrtc::LocalVideoTrackInterface*>(pTrack.get()) ); AddTrack(LocalVideoTrack::Create(pTrack_)); } for(int i=0; i<pStream->audio_tracks()->count(); i++) { talk_base::scoped_refptr<webrtc::AudioTrackInterface> pTrack(pStream->audio_tracks()->at(i)); talk_base::scoped_refptr<webrtc::LocalAudioTrackInterface> pTrack_( static_cast<webrtc::LocalAudioTrackInterface*>(pTrack.get()) ); AddTrack(LocalAudioTrack::Create(pTrack_)); } }
TEST_F(SearchQueryParserTest, MultipleTermsMultipleColumnsNegation) { QStringList searchColumns; searchColumns << "artist" << "album"; QScopedPointer<QueryNode> pQuery( m_parser.parseQuery("asdf -zxcv", searchColumns, "")); TrackPointer pTrack(new TrackInfoObject()); pTrack->setTitle("asdf zxcv"); EXPECT_FALSE(pQuery->match(pTrack)); pTrack->setAlbum("asDF"); EXPECT_TRUE(pQuery->match(pTrack)); pTrack->setArtist("zXcV"); EXPECT_FALSE(pQuery->match(pTrack)); pTrack->setArtist(""); pTrack->setAlbum("ASDF ZXCV"); EXPECT_FALSE(pQuery->match(pTrack)); EXPECT_STREQ( qPrintable(QString( "((artist LIKE '%asdf%') OR (album LIKE '%asdf%')) " "AND NOT ((artist LIKE '%zxcv%') OR (album LIKE '%zxcv%'))")), qPrintable(pQuery->toSql())); }
TEST_F(SearchQueryParserTest, HumanReadableDurationSearchwithRangeFilter) { QStringList searchColumns; searchColumns << "artist" << "album"; QScopedPointer<QueryNode> pQuery( m_parser.parseQuery("duration:2:30-3:20", searchColumns, "")); TrackPointer pTrack(new TrackInfoObject()); pTrack->setSampleRate(44100); pTrack->setDuration(80); EXPECT_FALSE(pQuery->match(pTrack)); pTrack->setDuration(150); EXPECT_TRUE(pQuery->match(pTrack)); pTrack->setDuration(199); EXPECT_TRUE(pQuery->match(pTrack)); EXPECT_STREQ( qPrintable(QString("(duration >= 150 AND duration <= 200)")), qPrintable(pQuery->toSql())); pQuery.reset(m_parser.parseQuery("duration:2:30-200", searchColumns, "")); pTrack->setSampleRate(44100); pTrack->setDuration(80); EXPECT_FALSE(pQuery->match(pTrack)); pTrack->setDuration(150); EXPECT_TRUE(pQuery->match(pTrack)); pTrack->setDuration(199); EXPECT_TRUE(pQuery->match(pTrack)); EXPECT_STREQ( qPrintable(QString("(duration >= 150 AND duration <= 200)")), qPrintable(pQuery->toSql())); pQuery.reset(m_parser.parseQuery("duration:150-200", searchColumns, "")); pTrack->setSampleRate(44100); pTrack->setDuration(80); EXPECT_FALSE(pQuery->match(pTrack)); pTrack->setDuration(150); EXPECT_TRUE(pQuery->match(pTrack)); pTrack->setDuration(199); EXPECT_TRUE(pQuery->match(pTrack)); EXPECT_STREQ( qPrintable(QString("(duration >= 150 AND duration <= 200)")), qPrintable(pQuery->toSql())); pQuery.reset(m_parser.parseQuery("duration:2m30s-3m20s", searchColumns, "")); pTrack->setSampleRate(44100); pTrack->setDuration(80); EXPECT_FALSE(pQuery->match(pTrack)); pTrack->setDuration(150); EXPECT_TRUE(pQuery->match(pTrack)); pTrack->setDuration(199); EXPECT_TRUE(pQuery->match(pTrack)); EXPECT_STREQ( qPrintable(QString("(duration >= 150 AND duration <= 200)")), qPrintable(pQuery->toSql())); }
TEST_F(SearchQueryParserTest, TextFilterTrailingSpace) { QStringList searchColumns; searchColumns << "artist" << "album"; auto pQuery( m_parser.parseQuery("comment:\"asdf \"", searchColumns, "")); TrackPointer pTrack(Track::newTemporary()); pTrack->setArtist("asdf"); EXPECT_FALSE(pQuery->match(pTrack)); pTrack->setComment("test ASDF test"); EXPECT_TRUE(pQuery->match(pTrack)); EXPECT_STREQ( qPrintable(QString("comment LIKE '%asdf _%'")), qPrintable(pQuery->toSql())); // We allow to search for two consequitve spaces auto pQuery2( m_parser.parseQuery("comment:\" \"", searchColumns, "")); EXPECT_FALSE(pQuery2->match(pTrack)); EXPECT_STREQ( qPrintable(QString("comment LIKE '% _%'")), qPrintable(pQuery2->toSql())); }
TrackPointer BaseTrackPlayerImpl::loadFakeTrack(bool bPlay, double filebpm) { TrackPointer pTrack(Track::newTemporary()); pTrack->setSampleRate(44100); // 10 seconds pTrack->setDuration(10); if (filebpm > 0) { pTrack->setBpm(filebpm); } TrackPointer pOldTrack = m_pLoadedTrack; m_pLoadedTrack = pTrack; if (m_pLoadedTrack) { // Listen for updates to the file's BPM connect(m_pLoadedTrack.get(), SIGNAL(bpmUpdated(double)), m_pFileBPM.get(), SLOT(set(double))); connect(m_pLoadedTrack.get(), SIGNAL(keyUpdated(double)), m_pKey.get(), SLOT(set(double))); // Listen for updates to the file's Replay Gain connect(m_pLoadedTrack.get(), SIGNAL(ReplayGainUpdated(mixxx::ReplayGain)), this, SLOT(slotSetReplayGain(mixxx::ReplayGain))); } // Request a new track from EngineBuffer EngineBuffer* pEngineBuffer = m_pChannel->getEngineBuffer(); pEngineBuffer->loadFakeTrack(pTrack, bPlay); // await slotTrackLoaded()/slotLoadFailed() emit(loadingTrack(pTrack, pOldTrack)); return pTrack; }
void DlgTrackInfo::reloadTrackMetadata() { if (m_pLoadedTrack) { TrackPointer pTrack(new TrackInfoObject(m_pLoadedTrack->getLocation(), m_pLoadedTrack->getSecurityToken())); populateFields(pTrack); } }
TEST_F(SoundSourceProxyTest, readArtist) { TrackPointer pTrack(new TrackInfoObject( QDir::currentPath().append("/src/test/id3-test-data/artist.mp3"))); SoundSourceProxy proxy(pTrack); Mixxx::TrackMetadata trackMetadata; EXPECT_EQ(OK, proxy.parseTrackMetadata(&trackMetadata)); EXPECT_EQ("Test Artist", trackMetadata.getArtist()); }
TEST_F(SoundSourceProxyTest, readArtist) { TrackPointer pTrack(Track::newTemporary( kTestDir.absoluteFilePath("artist.mp3"))); SoundSourceProxy proxy(pTrack); Mixxx::TrackMetadata trackMetadata; EXPECT_EQ(OK, proxy.parseTrackMetadata(&trackMetadata)); EXPECT_EQ("Test Artist", trackMetadata.getArtist()); }
//static QImage CoverArtUtils::extractEmbeddedCover( const QFileInfo& fileInfo, SecurityTokenPointer pToken) { // TODO(uklotzde): Resolve the TrackPointer from the track cache // to avoid accessing reading the file while it is written. TrackPointer pTrack( Track::newTemporary(fileInfo, pToken)); return SoundSourceProxy(pTrack).parseCoverImage(); }
TEST_F(SoundSourceProxyTest, TOAL_TPE2) { TrackPointer pTrack(Track::newTemporary( kTestDir.absoluteFilePath("TOAL_TPE2.mp3"))); SoundSourceProxy proxy(pTrack); Mixxx::TrackMetadata trackMetadata; EXPECT_EQ(OK, proxy.parseTrackMetadata(&trackMetadata)); EXPECT_EQ("TITLE2", trackMetadata.getArtist()); EXPECT_EQ("ARTIST", trackMetadata.getAlbum()); EXPECT_EQ("TITLE", trackMetadata.getAlbumArtist()); }
TEST_F(SearchQueryParserTest, EmptySearch) { QScopedPointer<QueryNode> pQuery( m_parser.parseQuery("", QStringList(), "")); TrackPointer pTrack(new TrackInfoObject()); EXPECT_FALSE(pQuery->match(pTrack)); EXPECT_STREQ(qPrintable(QString("")), qPrintable(pQuery->toSql())); }
TEST_F(SoundSourceProxyTest, TOAL_TPE2) { TrackPointer pTrack(new TrackInfoObject( QDir::currentPath().append("/src/test/id3-test-data/TOAL_TPE2.mp3"))); SoundSourceProxy proxy(pTrack); Mixxx::TrackMetadata trackMetadata; EXPECT_EQ(OK, proxy.parseTrackMetadata(&trackMetadata)); EXPECT_EQ("TITLE2", trackMetadata.getArtist()); EXPECT_EQ("ARTIST", trackMetadata.getAlbum()); EXPECT_EQ("TITLE", trackMetadata.getAlbumArtist()); }
TEST_F(SearchQueryParserTest, EmptySearch) { auto pQuery( m_parser.parseQuery("", QStringList(), "")); // An empty query matches all tracks. TrackPointer pTrack(Track::newTemporary()); EXPECT_TRUE(pQuery->match(pTrack)); EXPECT_STREQ(qPrintable(QString("")), qPrintable(pQuery->toSql())); }
void ImportFilesTask::run() { ScopedTimer timer("ImportFilesTask::run"); foreach (const QFileInfo& file, m_filesToImport) { // If a flag was raised telling us to cancel the library scan then stop. if (m_scannerGlobal->shouldCancel()) { setSuccess(false); return; } QString filePath = file.filePath(); //qDebug() << "ImportFilesTask::run" << filePath; // If the file does not exist in the database then add it. If it // does then it is either in the user's library OR the user has // "removed" the track via "Right-Click -> Remove". These tracks // stay in the library, but their mixxx_deleted column is 1. if (m_scannerGlobal->trackExistsInDatabase(filePath)) { // If the track is in the database, mark it as existing. This code gets // executed when other files in the same directory have changed (the // directory hash has changed). emit(trackExists(filePath)); } else { // Parse the track including cover art from metadata. This is a new // (never before seen) track so it is safe to parse cover art // without checking if we have cover art that is USER_SELECTED. If // this changes in the future you MUST check that the cover art is // not USER_SELECTED first. TrackPointer pTrack( new TrackInfoObject(filePath, m_pToken)); SoundSourceProxy(pTrack).loadTrackMetadataAndCoverArt(); // If cover art is not found in the track metadata, populate from // possibleCovers. // This is a new (never before seen) track so it is safe // to parse cover art without checking if we have cover art // that is USER_SELECTED. If this changes in the future you // MUST check that the cover art is not USER_SELECTED first. if (pTrack->getCoverArt().image.isNull()) { CoverArt art = CoverArtUtils::selectCoverArtForTrack( pTrack.data(), m_possibleCovers); if (!art.image.isNull()) { pTrack->setCoverArt(art); } } emit(addNewTrack(pTrack)); } } // Insert or update the hash in the database. emit(directoryHashedAndScanned(m_dirPath, !m_prevHashExists, m_newHash)); setSuccess(true); }
TEST_F(SearchQueryParserTest, NumericFilterEmpty) { QStringList searchColumns; searchColumns << "artist" << "album"; QScopedPointer<QueryNode> pQuery( m_parser.parseQuery("bpm:", searchColumns, "")); TrackPointer pTrack(new TrackInfoObject()); pTrack->setSampleRate(44100); pTrack->setBpm(127); EXPECT_TRUE(pQuery->match(pTrack)); EXPECT_STREQ( qPrintable(QString("")), qPrintable(pQuery->toSql())); }
TEST_F(SearchQueryParserTest, NumericFilterOperators) { QStringList searchColumns; searchColumns << "artist" << "album"; QScopedPointer<QueryNode> pQuery( m_parser.parseQuery("bpm:>127.12", searchColumns, "")); TrackPointer pTrack(new TrackInfoObject()); pTrack->setSampleRate(44100); pTrack->setBpm(127.12); EXPECT_FALSE(pQuery->match(pTrack)); pTrack->setBpm(127.13); EXPECT_TRUE(pQuery->match(pTrack)); EXPECT_STREQ( qPrintable(QString("(bpm > 127.12)")), qPrintable(pQuery->toSql())); pQuery.reset(m_parser.parseQuery("bpm:>=127.12", searchColumns, "")); pTrack->setBpm(127.11); EXPECT_FALSE(pQuery->match(pTrack)); pTrack->setBpm(127.12); EXPECT_TRUE(pQuery->match(pTrack)); EXPECT_STREQ( qPrintable(QString("(bpm >= 127.12)")), qPrintable(pQuery->toSql())); pQuery.reset(m_parser.parseQuery("bpm:<127.12", searchColumns, "")); pTrack->setBpm(127.12); EXPECT_FALSE(pQuery->match(pTrack)); pTrack->setBpm(127.11); EXPECT_TRUE(pQuery->match(pTrack)); EXPECT_STREQ( qPrintable(QString("(bpm < 127.12)")), qPrintable(pQuery->toSql())); pQuery.reset(m_parser.parseQuery("bpm:<=127.12", searchColumns, "")); pTrack->setBpm(127.13); EXPECT_FALSE(pQuery->match(pTrack)); pTrack->setBpm(127.12); EXPECT_TRUE(pQuery->match(pTrack)); EXPECT_STREQ( qPrintable(QString("(bpm <= 127.12)")), qPrintable(pQuery->toSql())); }
TEST_F(SearchQueryParserTest, TextFilterEmpty) { QStringList searchColumns; searchColumns << "artist" << "album"; // An empty argument should pass everything. QScopedPointer<QueryNode> pQuery( m_parser.parseQuery("comment:", searchColumns, "")); TrackPointer pTrack(new TrackInfoObject()); pTrack->setComment("test ASDF test"); EXPECT_TRUE(pQuery->match(pTrack)); EXPECT_STREQ( qPrintable(QString("")), qPrintable(pQuery->toSql())); }
TEST_F(SearchQueryParserTest, OneTermOneColumn) { QStringList searchColumns; searchColumns << "artist"; auto pQuery( m_parser.parseQuery("asdf", searchColumns, "")); TrackPointer pTrack(Track::newTemporary()); pTrack->setTitle("testASDFtest"); EXPECT_FALSE(pQuery->match(pTrack)); pTrack->setArtist("testASDFtest"); EXPECT_TRUE(pQuery->match(pTrack)); EXPECT_STREQ( qPrintable(QString("artist LIKE '%asdf%'")), qPrintable(pQuery->toSql())); }
TEST_F(SearchQueryParserTest, MultipleTermsOneColumn) { QStringList searchColumns; searchColumns << "artist"; QScopedPointer<QueryNode> pQuery( m_parser.parseQuery("asdf zxcv", searchColumns, "")); TrackPointer pTrack(new TrackInfoObject()); pTrack->setTitle("test zXcV test"); EXPECT_FALSE(pQuery->match(pTrack)); pTrack->setArtist("test zXcV test asDf"); EXPECT_TRUE(pQuery->match(pTrack)); EXPECT_STREQ( qPrintable(QString("(artist LIKE '%asdf%') AND (artist LIKE '%zxcv%')")), qPrintable(pQuery->toSql())); }
TEST_F(SearchQueryParserTest, NumericFilterOperators) { QStringList searchColumns; searchColumns << "artist" << "album"; auto pQuery( m_parser.parseQuery("bpm:>127.12", searchColumns, "")); TrackPointer pTrack(Track::newTemporary()); pTrack->setSampleRate(44100); pTrack->setBpm(127.12); EXPECT_FALSE(pQuery->match(pTrack)); pTrack->setBpm(127.13); EXPECT_TRUE(pQuery->match(pTrack)); EXPECT_STREQ( qPrintable(QString("bpm > 127.12")), qPrintable(pQuery->toSql())); pQuery = m_parser.parseQuery("bpm:>=127.12", searchColumns, ""); pTrack->setBpm(127.11); EXPECT_FALSE(pQuery->match(pTrack)); pTrack->setBpm(127.12); EXPECT_TRUE(pQuery->match(pTrack)); EXPECT_STREQ( qPrintable(QString("bpm >= 127.12")), qPrintable(pQuery->toSql())); pQuery = m_parser.parseQuery("bpm:<127.12", searchColumns, ""); pTrack->setBpm(127.12); EXPECT_FALSE(pQuery->match(pTrack)); pTrack->setBpm(127.11); EXPECT_TRUE(pQuery->match(pTrack)); EXPECT_STREQ( qPrintable(QString("bpm < 127.12")), qPrintable(pQuery->toSql())); pQuery = m_parser.parseQuery("bpm:<=127.12", searchColumns, ""); pTrack->setBpm(127.13); EXPECT_FALSE(pQuery->match(pTrack)); pTrack->setBpm(127.12); EXPECT_TRUE(pQuery->match(pTrack)); EXPECT_STREQ( qPrintable(QString("bpm <= 127.12")), qPrintable(pQuery->toSql())); }
TEST_F(SearchQueryParserTest, ExtraFilterAppended) { QStringList searchColumns; searchColumns << "artist"; QScopedPointer<QueryNode> pQuery( m_parser.parseQuery("asdf", searchColumns, "1 > 2")); TrackPointer pTrack(new TrackInfoObject()); pTrack->setArtist("zxcv"); EXPECT_FALSE(pQuery->match(pTrack)); pTrack->setArtist("asdf"); EXPECT_TRUE(pQuery->match(pTrack)); EXPECT_STREQ( qPrintable(QString("(1 > 2) AND (artist LIKE '%asdf%')")), qPrintable(pQuery->toSql())); }
TEST_F(SearchQueryParserTest, OneTermMultipleColumnsNegation) { QStringList searchColumns; searchColumns << "artist" << "album"; QScopedPointer<QueryNode> pQuery( m_parser.parseQuery("-asdf", searchColumns, "")); TrackPointer pTrack(new TrackInfoObject()); pTrack->setTitle("testASDFtest"); EXPECT_TRUE(pQuery->match(pTrack)); pTrack->setAlbum("testASDFtest"); EXPECT_FALSE(pQuery->match(pTrack)); EXPECT_STREQ( qPrintable(QString("NOT ((artist LIKE '%asdf%') OR (album LIKE '%asdf%'))")), qPrintable(pQuery->toSql())); }
TEST_F(SearchQueryParserTest, TextFilterQuotes) { QStringList searchColumns; searchColumns << "artist" << "album"; auto pQuery( m_parser.parseQuery("comment:\"asdf ewe\"", searchColumns, "")); TrackPointer pTrack(Track::newTemporary()); pTrack->setArtist("asdf"); EXPECT_FALSE(pQuery->match(pTrack)); pTrack->setComment("test ASDF ewetest"); EXPECT_TRUE(pQuery->match(pTrack)); EXPECT_STREQ( qPrintable(QString("comment LIKE '%asdf ewe%'")), qPrintable(pQuery->toSql())); }
TEST_F(SearchQueryParserTest, TextFilterNegation) { QStringList searchColumns; searchColumns << "artist" << "album"; QScopedPointer<QueryNode> pQuery( m_parser.parseQuery("-comment: asdf", searchColumns, "")); TrackPointer pTrack(new TrackInfoObject()); pTrack->setArtist("asdf"); EXPECT_TRUE(pQuery->match(pTrack)); pTrack->setComment("test ASDF test"); EXPECT_FALSE(pQuery->match(pTrack)); EXPECT_STREQ( qPrintable(QString("NOT (comment LIKE '%asdf%')")), qPrintable(pQuery->toSql())); }
TEST_F(SearchQueryParserTest, TextFilterQuote_NoEndQuoteTakesWholeQuery) { QStringList searchColumns; searchColumns << "artist" << "album"; QScopedPointer<QueryNode> pQuery( m_parser.parseQuery("comment:\"asdf zxcv qwer", searchColumns, "")); TrackPointer pTrack(new TrackInfoObject()); pTrack->setArtist("asdf zxcv qwer"); EXPECT_FALSE(pQuery->match(pTrack)); pTrack->setComment("test ASDF zxcv qwer test"); EXPECT_TRUE(pQuery->match(pTrack)); EXPECT_STREQ( qPrintable(QString("(comment LIKE '%asdf zxcv qwer%')")), qPrintable(pQuery->toSql())); }
TEST_F(SearchQueryParserTest, TextFilterAllowsSpace) { QStringList searchColumns; searchColumns << "artist" << "album"; auto pQuery( m_parser.parseQuery("comment: asdf", searchColumns, "")); TrackPointer pTrack(new TrackInfoObject()); pTrack->setArtist("asdf"); EXPECT_FALSE(pQuery->match(pTrack)); pTrack->setComment("test ASDF test"); EXPECT_TRUE(pQuery->match(pTrack)); EXPECT_STREQ( qPrintable(QString("comment LIKE '%asdf%'")), qPrintable(pQuery->toSql())); }
TEST_F(SearchQueryParserTest, NumericFilterNegation) { QStringList searchColumns; searchColumns << "artist" << "album"; auto pQuery( m_parser.parseQuery("-bpm:127.12", searchColumns, "")); TrackPointer pTrack(Track::newTemporary()); pTrack->setSampleRate(44100); pTrack->setBpm(127); EXPECT_TRUE(pQuery->match(pTrack)); pTrack->setBpm(127.12); EXPECT_FALSE(pQuery->match(pTrack)); EXPECT_STREQ( qPrintable(QString("NOT (bpm = 127.12)")), qPrintable(pQuery->toSql())); }
TEST_F(SearchQueryParserTest, NumericFilterAllowsSpace) { QStringList searchColumns; searchColumns << "artist" << "album"; auto pQuery( m_parser.parseQuery("bpm: 127.12", searchColumns, "")); TrackPointer pTrack(new TrackInfoObject()); pTrack->setSampleRate(44100); pTrack->setBpm(127); EXPECT_FALSE(pQuery->match(pTrack)); pTrack->setBpm(127.12); EXPECT_TRUE(pQuery->match(pTrack)); EXPECT_STREQ( qPrintable(QString("bpm = 127.12")), qPrintable(pQuery->toSql())); }
void loadCoverFromMetadata(QString trackLocation) { CoverInfo info; info.type = CoverInfo::METADATA; info.source = CoverInfo::GUESSED; info.coverLocation = QString(); info.trackLocation = trackLocation; CoverArtCache::FutureResult res; res = CoverArtCache::loadCover(info, NULL, 0, false); EXPECT_QSTRING_EQ(QString(), res.cover.coverLocation); EXPECT_EQ(info.hash, res.cover.hash); SecurityTokenPointer securityToken = Sandbox::openSecurityToken( QDir(trackLocation), true); TrackPointer pTrack(Track::newTemporary(trackLocation, securityToken)); SoundSourceProxy proxy(pTrack); QImage img(SoundSourceProxy(pTrack).parseCoverImage()); EXPECT_FALSE(img.isNull()); EXPECT_EQ(img, res.cover.image); }
TEST_F(SearchQueryParserTest, NumericRangeFilter) { QStringList searchColumns; searchColumns << "artist" << "album"; QScopedPointer<QueryNode> pQuery( m_parser.parseQuery("bpm:127.12-129", searchColumns, "")); TrackPointer pTrack(new TrackInfoObject()); pTrack->setSampleRate(44100); pTrack->setBpm(125); EXPECT_FALSE(pQuery->match(pTrack)); pTrack->setBpm(127.12); EXPECT_TRUE(pQuery->match(pTrack)); pTrack->setBpm(129); EXPECT_TRUE(pQuery->match(pTrack)); EXPECT_STREQ( qPrintable(QString("(bpm >= 127.12 AND bpm <= 129)")), qPrintable(pQuery->toSql())); }