Esempio n. 1
0
static void biasSelection(float value)
{
	int track, row;
	struct sync_track** tracks = getTracks();
	TrackViewInfo* viewInfo = getTrackViewInfo();
	int selectLeft = mini(viewInfo->selectStartTrack, viewInfo->selectStopTrack);
	int selectRight = maxi(viewInfo->selectStartTrack, viewInfo->selectStopTrack);
	int selectTop = mini(viewInfo->selectStartRow, viewInfo->selectStopRow);
	int selectBottom = maxi(viewInfo->selectStartRow, viewInfo->selectStopRow);
	
	// If we have no selection and no currenty key bias the previous key

	if (selectLeft == selectRight && selectTop == selectBottom)
	{
		int idx;
		struct sync_track* track;
		struct sync_track** tracks = getTracks();

		if (!tracks || !tracks[getActiveTrack()]->keys)
			return;

		track = tracks[getActiveTrack()];

		idx = sync_find_key(track, getRowPos());
		
		if (idx < 0) 
		{
			idx = -idx - 1;
			selectTop = selectBottom = track->keys[emaxi(idx - 1, 0)].row;
		}
	}
	
	Commands_beginMulti("biasSelection");

	for (track = selectLeft; track <= selectRight; ++track) 
	{
		struct sync_track* t = tracks[track];

		for (row = selectTop; row <= selectBottom; ++row) 
		{
			struct track_key newKey;
			int idx = sync_find_key(t, row);
			if (idx < 0) 
				continue;

			newKey = t->keys[idx];
			newKey.value += value;

			Commands_updateKey(track, &newKey);
		}
	}

	Commands_endMulti();
	updateNeedsSaving();
}
Esempio n. 2
0
static void endEditing()
{
	const char* track_name;
	struct track_key key;
	struct sync_track* track;
	int row_pos = getRowPos();
	int active_track = getActiveTrack();

	if (!is_editing || !getTracks())
		return;

	track = getTracks()[active_track];

	if (strcmp(s_editBuffer, ""))
	{

		key.row = row_pos;
		key.value = (float)atof(s_editBuffer);
		key.type = 0;

		if (track->num_keys > 0)
		{
			int idx = sync_find_key(track, getRowPos());

			if (idx > 0)
			{
				// exact match, keep current type
				key.type = track->keys[emaxi(idx, 0)].type;
			}
			else
			{
				// no match, grab type from previous key
				if (idx < 0)
					idx = -idx - 1;

				key.type = track->keys[emaxi(idx - 1, 0)].type;
			}
		}	

		track_name = track->name; 

		Commands_addOrUpdateKey(active_track, &key);
		updateNeedsSaving();
	}

	is_editing = false;
	s_editorData.trackData.editText = 0;
}
Esempio n. 3
0
void UserMediaRequest::allow(const String& audioDeviceUID, const String& videoDeviceUID)
{
    m_allowedAudioDeviceUID = audioDeviceUID;
    m_allowedVideoDeviceUID = videoDeviceUID;

    RefPtr<UserMediaRequest> protectedThis = this;
    RealtimeMediaSourceCenter::NewMediaStreamHandler callback = [this, protectedThis = WTFMove(protectedThis)](RefPtr<MediaStreamPrivate>&& privateStream) mutable {
        if (!m_scriptExecutionContext)
            return;

        if (!privateStream) {
            deny(MediaAccessDenialReason::HardwareError, emptyString());
            return;
        }

        auto stream = MediaStream::create(*m_scriptExecutionContext, WTFMove(privateStream));
        if (stream->getTracks().isEmpty()) {
            deny(MediaAccessDenialReason::HardwareError, emptyString());
            return;
        }

        for (auto& track : stream->getAudioTracks())
            track->source().startProducingData();

        for (auto& track : stream->getVideoTracks())
            track->source().startProducingData();

        m_promise.resolve(stream);
    };

    RealtimeMediaSourceCenter::singleton().createMediaStream(WTFMove(callback), m_allowedAudioDeviceUID, m_allowedVideoDeviceUID, &m_audioConstraints.get(), &m_videoConstraints.get());
}
Esempio n. 4
0
 ///\brief Builds an index file for HTTP Dynamic streaming.
 ///\return The index file for HTTP Dynamic Streaming.
 std::string OutHDS::dynamicIndex(){
   getTracks();
   std::stringstream Result;
   Result << "<?xml version=\"1.0\" encoding=\"utf-8\"?>" << std::endl;
   Result << "  <manifest xmlns=\"http://ns.adobe.com/f4m/1.0\">" << std::endl;
   Result << "  <id>" << streamName << "</id>" << std::endl;
   Result << "  <mimeType>video/mp4</mimeType>" << std::endl;
   Result << "  <deliveryType>streaming</deliveryType>" << std::endl;
   if (myMeta.vod){
     Result << "  <duration>" << myMeta.tracks[*videoTracks.begin()].lastms / 1000 << ".000</duration>" << std::endl;
     Result << "  <streamType>recorded</streamType>" << std::endl;
   }else{
     Result << "  <duration>0.00</duration>" << std::endl;
     Result << "  <streamType>live</streamType>" << std::endl;
   }
   for (std::set<int>::iterator it = videoTracks.begin(); it != videoTracks.end(); it++){
     Result << "  <bootstrapInfo "
     "profile=\"named\" "
     "id=\"boot" << (*it) << "\" "
     "url=\"" << (*it) << ".abst\">"
     "</bootstrapInfo>" << std::endl;
     Result << "  <media "
     "url=\"" << (*it) << "-\" "
     "bitrate=\"" << myMeta.tracks[(*it)].bps * 8 << "\" "
     "bootstrapInfoId=\"boot" << (*it) << "\" "
     "width=\"" << myMeta.tracks[(*it)].width << "\" "
     "height=\"" << myMeta.tracks[(*it)].height << "\">" << std::endl;
     Result << "    <metadata>AgAKb25NZXRhRGF0YQMAAAk=</metadata>" << std::endl;
     Result << "  </media>" << std::endl;
   }
   Result << "</manifest>" << std::endl;
   DEBUG_MSG(DLVL_HIGH, "Sending manifest: %s", Result.str().c_str());
   return Result.str();
 } //BuildManifest
Esempio n. 5
0
static void deleteArea(int rowPos, int track, int bufferWidth, int bufferHeight)
{
	int i, j;
	const int track_count = getTrackCount();
	struct sync_track** tracks = getTracks();

	Commands_beginMulti("deleteArea");

	for (i = 0; i < bufferWidth; ++i) 
	{
		struct sync_track* t;
		int trackPos = track + i;
		int trackIndex = trackPos;

		if (trackPos >= track_count) 
			continue;

		t = tracks[trackIndex];

		for (j = 0; j < bufferHeight; ++j) 
		{
			int row = rowPos + j;

			Commands_deleteKey(trackIndex, row);
		}
	}

	Commands_endMulti();
	updateNeedsSaving();
}
void MusicCollection::displayTracks() {
	std::cout << "\nTracks\n-----------------------------\n";
	MusicTrackIterator it = getTracks();
	while( it.hasNext() ) {
		MusicTrack *track = it.next();
		std::cout << track->getTitle() << std::endl;
	}
}
Esempio n. 7
0
 ChessPiece::Moves& ChessPiece::getValidMoves()
 {
     if( !m_validMoves.size() )
     {
         // calculate valid moves from current position
         Tracks tracks = getTracks();
         for( Tracks::const_iterator i = getTracks().begin(); i != getTracks().end(); i++ )
         {
             const Position::Track& track = *i;
             if( m_currentPos.isValidMove( track ) )
             {
                 Position newPos = m_currentPos + track;
                 m_validMoves.push_back( newPos );
             }
         }
     }
     return m_validMoves;
 }
Esempio n. 8
0
void ofxTLPage::draw(){	
    ofSetLineWidth(1);
	for(int i = 0; i < headers.size(); i++){
	//for(int i = headers.size() - 1; i >= 0; i--){
		headers[i]->draw();
		tracks[headers[i]->name]->_draw();
	}
   
#if 0
	// snap from bottom of ticker to bottom edge of timeline
	//if(!headerHasFocus && !footerIsDragging && draggingInside && snapPoints.size() > 0){
		ofPushStyle();
		//ofSetColor(255,255,255,100);
		ofSetColor(0, 0, 0,200);
		set<unsigned long>::iterator it;
//		for(int i = 0; i < snapPoints.size(); i++){
		vector<ofxTLTrack*>::iterator t = getTracks().begin();
		if (getTracks().size() >= 3) { t++; t++; }
		for(it = snapPoints.begin(); it != snapPoints.end(); it++){
			//ofLine(timeline->millisToScreenX(*it), trackContainerRect.y, timeline->millisToScreenX(*it), trackContainerRect.y+trackContainerRect.height);
			float x = timeline->millisToScreenX(*it);
			float y1 = (*t)->getDrawRect().y;
			float y2 = y1 + (*t)->getDrawRect().height;
			ofLine(x, y1, x, y2);
		}
		ofPopStyle();
	//}
#endif
//	for(int i = 0; i < headers.size(); i++){
//		tracks[headers[i]->name]->drawModalContent();
//	}
    
    ofSetLineWidth(1);
    if(draggingSelectionRectangle){
		ofFill();
		ofSetColor(timeline->getColors().keyColor, 30);
		ofRect(selectionRectangle);
		
		ofNoFill();
		ofSetColor(timeline->getColors().keyColor, 255);
		ofRect(selectionRectangle);
		
	}
}
int MusicCollection::generateTrackList(std::ostream& out) {
	int count = 0;
	MusicTrackIterator iter = getTracks();
	while( iter.hasNext() ) {
		MusicTrack *track = iter.next();
		out << track->getLocation().toStdString() << std::endl;
		count++;
	}
	return count;
}
Esempio n. 10
0
// ----------------------------------------------------------------------------
//
void SpotifyEngine::queueTracks( sp_playlist* pl ) 
{
    CSingleLock lock( &m_mutex, TRUE );

    for ( auto const& track : getTracks(pl) )
        m_track_queue.push_back( TrackQueueEntry( track, 0L ) );

    sendCommand( CMD_CHECK_PLAYING );

    sendTrackQueueEvent();
}
Esempio n. 11
0
// ----------------------------------------------------------------------------
//
void SpotifyEngine::playTracks( sp_playlist* pl ) 
{
    CSingleLock lock( &m_mutex, TRUE );
    m_track_queue.clear();

    for ( auto const& track : getTracks(pl) )
        m_track_queue.push_back( TrackQueueEntry( track, 0L ) );

    sendCommand( CMD_NEXT_TRACK );

    sendTrackQueueEvent();
}
Esempio n. 12
0
static void onPrevNextKey(bool prevKey, enum Selection selection)
{
	struct sync_track* track;
	struct sync_track** tracks = getTracks();
	TrackViewInfo* viewInfo = getTrackViewInfo(); 

	if (!tracks || !tracks[getActiveTrack()]->keys)
		return;

	track = tracks[getActiveTrack()];

	if (prevKey)
	{
		int idx = sync_find_key(track, getRowPos());
		if (idx < 0)
			idx = -idx - 1;

		setRowPos(track->keys[emaxi(idx - 1, 0)].row);

		if (selection == DO_SELECTION)
			viewInfo->selectStopRow = getRowPos();
		else
			viewInfo->selectStartRow = viewInfo->selectStopRow = getRowPos();
	}
	else
	{
		int row = 0;

		int idx = key_idx_floor(track, getRowPos());

		if (idx < 0)
			row = track->keys[0].row;
		else if (idx > (int)track->num_keys - 2)
			row = track->keys[track->num_keys - 1].row;
		else
			row = track->keys[idx + 1].row;

		setRowPos(row);	

		if (selection == DO_SELECTION)
			viewInfo->selectStopRow = row;
		else
			viewInfo->selectStartRow = viewInfo->selectStopRow = row;
	}
}
Esempio n. 13
0
static void onEnterCurrentValue()
{
	int idx;
	struct track_key key;
	struct sync_track* track;
	struct sync_track** tracks = getTracks();
	const int rowPos = getRowPos();
	const int activeTrack = getActiveTrack();

	if (!tracks)
		return;

	track = tracks[activeTrack];

	if (!track->keys)
	{
		key.row = rowPos;
		key.value = 0.0f;
		key.type = 0;

		Commands_addOrUpdateKey(activeTrack, &key);
		updateNeedsSaving();
		return;
	}

	idx = sync_find_key(track, rowPos);
	if (idx < 0)
		idx = -idx - 1;

    key.row = rowPos;
   
    if (track->num_keys > 0)
    {
        key.value = (float)sync_get_val(track, rowPos);
        key.type = track->keys[emaxi(idx - 1, 0)].type;
    }
    else
    {
        key.value = 0.0f;
        key.type = 0;
    }
    
	Commands_addOrUpdateKey(activeTrack, &key);
	updateNeedsSaving();
}
Esempio n. 14
0
static void copySelection(int row, int track, int selectLeft, int selectRight, int selectTop, int selectBottom)
{
	CopyEntry* entry = 0;
	int copy_count = 0;
	struct sync_track** tracks = getTracks();

	// Count how much we need to copy

	for (track = selectLeft; track <= selectRight; ++track) 
	{
		struct sync_track* t = tracks[track];
		for (row = selectTop; row <= selectBottom; ++row) 
		{
			int idx = sync_find_key(t, row);
			if (idx < 0) 
				continue;

			copy_count++;
		}
	}

	free(s_copyData.entries);
	entry = s_copyData.entries = malloc(sizeof(CopyEntry) * copy_count);

	for (track = selectLeft; track <= selectRight; ++track) 
	{
		struct sync_track* t = tracks[track];
		for (row = selectTop; row <= selectBottom; ++row) 
		{
			int idx = sync_find_key(t, row);
			if (idx < 0) 
				continue;

			entry->track = track - selectLeft;
			entry->keyFrame = t->keys[idx];
			entry->keyFrame.row -= selectTop; 
			entry++;
		}
	}

	s_copyData.bufferWidth = selectRight - selectLeft + 1;
	s_copyData.bufferHeight = selectBottom - selectTop + 1;
	s_copyData.count = copy_count;
}
Esempio n. 15
0
std::vector<Database::IdType>
getSimilarArtists(Wt::Dbo::Session& session, Database::IdType artistId, std::size_t maxCount)
{
	std::vector<Database::IdType> res;

	Wt::Dbo::Transaction transaction(session);

	auto artist = Database::Artist::getById(session, artistId);
	if (!artist)
		return res;

	auto artistTracks = artist->getTracks();
	std::set<Database::IdType> artistTrackIds;

	for (const auto& artistTrack : artistTracks)
		artistTrackIds.insert(artistTrack.id());

	auto trackIds = getSimilarTracks(session, artistTrackIds, maxCount * 5);

	for (auto trackId : trackIds)
	{
		auto track = Database::Track::getById(session, trackId);
		if (!track)
			continue;

		for (auto trackArtist : track->getArtists())
		{
			if (!trackArtist || trackArtist.id() == artistId)
				continue;

			if (std::find(res.begin(), res.end(), trackArtist.id()) != res.end())
				continue;

			res.push_back(trackArtist.id());
		}

		if (res.size() == maxCount)
			break;
	}

	return res;
}
Esempio n. 16
0
std::vector<Database::IdType>
getSimilarReleases(Wt::Dbo::Session& session, Database::IdType releaseId, std::size_t maxCount)
{
	std::vector<Database::IdType> res;

	Wt::Dbo::Transaction transaction(session);

	auto release = Database::Release::getById(session, releaseId);
	if (!release)
		return res;

	auto releaseTracks = release->getTracks();
	std::set<Database::IdType> releaseTrackIds;

	for (const auto& releaseTrack : releaseTracks)
		releaseTrackIds.insert(releaseTrack.id());

	auto trackIds = getSimilarTracks(session, releaseTrackIds, maxCount * 5);

	for (auto trackId : trackIds)
	{
		auto track = Database::Track::getById(session, trackId);
		if (!track)
			continue;

		auto trackRelease = track->getRelease();
		if (!trackRelease || trackRelease.id() == releaseId)
			continue;

		if (std::find(res.begin(), res.end(), trackRelease.id()) != res.end())
			continue;

		res.push_back(trackRelease.id());

		if (res.size() == maxCount)
			break;
	}

	return res;
}
Esempio n. 17
0
static int drawCurrentValue(int posX, int sizeY)
{
	char valueText[256];
	float value = 0.0f; 
	int active_track = 0;
	int current_row = 0;
	const char *str = "---";
	struct sync_track** tracks = getTracks();

	active_track = getActiveTrack();
	current_row = getRowPos();

	if (tracks)
	{
		const struct sync_track* track = tracks[active_track];
		int idx = key_idx_floor(track, current_row);

		if (idx >= 0) 
		{
			switch (track->keys[idx].type) 
			{
				case KEY_STEP:   str = "step"; break;
				case KEY_LINEAR: str = "linear"; break;
				case KEY_SMOOTH: str = "smooth"; break;
				case KEY_RAMP:   str = "ramp"; break;
				default: break;
			}
		}

		value = (float)sync_get_val(track, current_row);
	}

	snprintf(valueText, 256, "%f", value);
	Emgui_drawText(valueText, posX + 4, sizeY - 15, Emgui_color32(160, 160, 160, 255));
	Emgui_drawBorder(Emgui_color32(10, 10, 10, 255), Emgui_color32(10, 10, 10, 255), posX, sizeY - 17, 80, 15); 
	Emgui_drawText(str, posX + 85, sizeY - 15, Emgui_color32(160, 160, 160, 255));
	Emgui_drawBorder(Emgui_color32(10, 10, 10, 255), Emgui_color32(10, 10, 10, 255), posX + 80, sizeY - 17, 40, 15); 

	return 130;
}
Esempio n. 18
0
static void onInterpolation()
{
	int idx;
	struct track_key newKey;
	struct sync_track* track;
	struct sync_track** tracks = getTracks();

	if (!tracks)
		return;

	track = tracks[getActiveTrack()];

	idx = key_idx_floor(track, getRowPos());
	if (idx < 0) 
		return;

	newKey = track->keys[idx];
	newKey.type = ((newKey.type + 1) % KEY_TYPE_COUNT);

	Commands_addOrUpdateKey(getActiveTrack(), &newKey);
	updateNeedsSaving();
}
Esempio n. 19
0
static void onSelectTrack()
{
	int activeTrack = getActiveTrack();
	TrackViewInfo* viewInfo = getTrackViewInfo();
	struct sync_track** tracks;
	struct sync_track* track;
	
	if (!(tracks = getTracks()))
		return;

	track = tracks[activeTrack];
	viewInfo->selectStartTrack = viewInfo->selectStopTrack = activeTrack;

	if (track->keys)
	{
		viewInfo->selectStartRow = track->keys[0].row;
		viewInfo->selectStopRow = track->keys[track->num_keys - 1].row;
	}
	else
	{
		viewInfo->selectStartRow = viewInfo->selectStopRow = getRowPos();
	}
}
void SoundCloudPlaylistWindow::onPlaylistStatusChanged(QSoundCloud::ResourcesRequest::Status status) {
    switch (status) {
    case QSoundCloud::ResourcesRequest::Loading:
        showProgressIndicator();
        return;
    case QSoundCloud::ResourcesRequest::Ready:
        loadPlaylistUi();
        getTracks();
        connect(m_artist, SIGNAL(statusChanged(QSoundCloud::ResourcesRequest::Status)), this,
                SLOT(onArtistStatusChanged(QSoundCloud::ResourcesRequest::Status)));
        m_artist->loadArtist(m_playlist->artistId());
        break;
    case QSoundCloud::ResourcesRequest::Failed:
        QMessageBox::critical(this, tr("Error"), m_playlist->errorString());
        break;
    default:
        break;
    }
    
    hideProgressIndicator();
    disconnect(m_playlist, SIGNAL(statusChanged(QSoundCloud::ResourcesRequest::Status)),
               this, SLOT(onPlaylistStatusChanged(QSoundCloud::ResourcesRequest::Status)));
}
SoundCloudPlaylistWindow::SoundCloudPlaylistWindow(SoundCloudPlaylist *playlist, StackedWindow *parent) :
    StackedWindow(parent),
    m_playlist(new SoundCloudPlaylist(playlist, this)),
    m_artist(new SoundCloudArtist(this)),
    m_model(new SoundCloudTrackModel(this)),
    m_cache(new ImageCache),
    m_thumbnail(new Image(this)),
    m_avatar(new Image(this)),
    m_nowPlayingAction(new NowPlayingAction(this)),
    m_view(new ListView(this)),
    m_delegate(new TrackDelegate(m_cache, SoundCloudTrackModel::ArtistRole, SoundCloudTrackModel::DateRole,
                                 SoundCloudTrackModel::DurationStringRole, SoundCloudTrackModel::ThumbnailUrlRole,
                                 SoundCloudTrackModel::TitleRole, this)),
    m_scrollArea(new QScrollArea(this)),
    m_titleLabel(new QLabel(this)),
    m_descriptionLabel(new TextBrowser(this)),
    m_dateLabel(new QLabel(this)),
    m_artistLabel(new QLabel(this)),
    m_noTracksLabel(new QLabel(QString("<p align='center'; style='font-size: 40px; color: %1'>%2</p>")
                                      .arg(palette().color(QPalette::Mid).name()).arg(tr("No tracks found")), this)),
    m_reloadAction(new QAction(tr("Reload"), this)),
    m_queuePlaylistAction(new QAction(tr("Queue"), this)),
    m_contextMenu(new QMenu(this)),
    m_queueAction(new QAction(tr("Queue"), this)),
    m_downloadAction(new QAction(tr("Download"), this)),
    m_shareAction(new QAction(tr("Copy URL"), this)),
    m_favouriteAction(0)
{
    loadBaseUi();
    loadPlaylistUi();
    getTracks();
    connect(m_artist, SIGNAL(statusChanged(QSoundCloud::ResourcesRequest::Status)), this,
            SLOT(onArtistStatusChanged(QSoundCloud::ResourcesRequest::Status)));
    
    m_artist->loadArtist(playlist->artistId());
}
Esempio n. 22
0
bool AudioCDDemux::open( const QString &_url )
{
#ifdef Q_OS_WIN
	if ( _url.toLower().contains( QRegExp( "file://\\D:/track\\d\\d.cda" ) ) )
	{
		QString url = _url;
		url.remove( "file://" );
		device = url.mid( 0, url.indexOf( '/' ) );
		trackNo = url.mid( url.toLower().indexOf( "track" ) + 5, 2 ).toUInt();
	}
	else
#endif
	{
		if ( _url.left( 10 ) != "AudioCD://" )
			return false;
		QUrl url( _url.mid( 10 ) );
		device = QUrlQuery( url ).queryItemValue( "device" );
		trackNo = url.path().toUInt();
	}
	if ( trackNo > 0 && trackNo < CDIO_INVALID_TRACK )
	{
		cdio = destroyTimer.getInstance( device, discID );
		if ( cdio || ( cdio = cdio_open( device.toLocal8Bit(), DRIVER_UNKNOWN ) ) )
		{
			cdio_set_speed( cdio, 1 );
			numTracks = cdio_get_num_tracks( cdio );
			if ( cdio_get_discmode( cdio ) != CDIO_DISC_MODE_ERROR && numTracks > 0 && numTracks != CDIO_INVALID_TRACK )
			{
				chn = cdio_get_track_channels( cdio, trackNo );
				if ( numTracks >= trackNo && ( chn == 2 || chn == 4 ) )
				{
					if ( useCDTEXT )
					{
						readCDText( 0 );
						readCDText( trackNo );
					}
					isData = cdio_get_track_format( cdio, trackNo ) != TRACK_FORMAT_AUDIO;
					duration = CD_BLOCKSIZE / chn / ( double )srate;
					startSector = cdio_get_track_lsn( cdio, trackNo );
					numSectors = cdio_get_track_last_lsn( cdio, trackNo ) - startSector;

					if ( useCDDB && Title.isEmpty() )
					{
						cddb_disc_t *cddb_disc;
						if ( freedb_query( cddb_disc ) )
						{
							if ( cdTitle.isEmpty() && cdArtist.isEmpty() )
								freedb_get_disc_info( cddb_disc );
							freedb_get_track_info( cddb_disc );
							cddb_disc_destroy( cddb_disc );
						}
					}

					StreamInfo *streamInfo = new StreamInfo;
					streamInfo->type = QMPLAY2_TYPE_AUDIO;
					streamInfo->is_default = true;
					streamInfo->sample_rate = srate;
					streamInfo->channels = chn;
					streams_info += streamInfo;

					return true;
				}
				else
					QMPlay2Core.log( tr( "Błąd odczytu ścieżki" ) );
			}
			else
				QMPlay2Core.log( tr( "Brak płyty w napędzie" ) );
		}
		else
			QMPlay2Core.log( tr( "Nieprawidłowa ścieżka do napędu CD" ) );
	}
	else //dodawanie do listy ścieżek AudioCD
	{
#ifndef Q_OS_WIN
		device = QUrl( _url ).path();
#else
		device = _url.mid( strlen( AudioCDName"://" ), 2 );
#endif
#ifndef Q_OS_WIN
		if ( !QFileInfo( device ).isDir() )
#endif
			if ( !device.isEmpty() )
			{
				emit QMPlay2Core.processParam( "DelPlaylistEntries", _url );
				QList< Playlist::Entry > entries = getTracks( device );
				if ( !entries.isEmpty() && Playlist::write( entries, "file://" + AudioCDPlaylist ) )
				{
					emit QMPlay2Core.processParam( "open", AudioCDPlaylist );
					return true;
				}
			}
	}
	return false;
}
Esempio n. 23
0
std::vector<Track> Manager::getVideoTracks()
{
    return getTracks(videoTracks);
}
Esempio n. 24
0
std::vector<Track> Manager::getAudioTracks()
{
    return getTracks(audioTracks);
}
Esempio n. 25
0
	void Context::open(const char * file)
	{
		fh = MP4Read(file, 0);
		if (fh == MP4_INVALID_FILE_HANDLE) throw Exception(file, "Open failed");
		getTracks(file);
	}
Esempio n. 26
0
std::vector<Track> Manager::getSubtitleTracks()
{
    return getTracks(subtitleTracks);
}
Esempio n. 27
0
std::vector<Track> Manager::getTeletextTracks()
{
    return getTracks(teletextTracks);
}
Esempio n. 28
0
  void OutHDS::onHTTP(){

    if (H.url.find(".abst") != std::string::npos){
      initialize();
      std::string streamID = H.url.substr(streamName.size() + 10);
      streamID = streamID.substr(0, streamID.find(".abst"));
      H.Clean();
      H.SetBody(dynamicBootstrap(atoll(streamID.c_str())));
      H.SetHeader("Content-Type", "binary/octet");
      H.SetHeader("Cache-Control", "no-cache");
      H.SendResponse("200", "OK", myConn);
      H.Clean(); //clean for any possible next requests
      return;
    }
    if (H.url.find("f4m") == std::string::npos){
      initialize();
      std::string tmp_qual = H.url.substr(H.url.find("/", 10) + 1);
      unsigned int tid;
      unsigned int fragNum;
      tid = atoi(tmp_qual.substr(0, tmp_qual.find("Seg") - 1).c_str());
      int temp;
      temp = H.url.find("Seg") + 3;
      temp = H.url.find("Frag") + 4;
      fragNum = atoi(H.url.substr(temp).c_str()) - 1;
      DEBUG_MSG(DLVL_MEDIUM, "Video track %d, fragment %d\n", tid, fragNum);
      if (!audioTrack){getTracks();}
      unsigned int mstime = 0;
      unsigned int mslen = 0;
      if (fragNum < (unsigned int)myMeta.tracks[tid].missedFrags){
        H.Clean();
        H.SetBody("The requested fragment is no longer kept in memory on the server and cannot be served.\n");
        H.SendResponse("412", "Fragment out of range", myConn);
        H.Clean(); //clean for any possible next requests
        std::cout << "Fragment " << fragNum << " too old" << std::endl;
        return;
      }
      //delay if we don't have the next fragment available yet
      unsigned int timeout = 0;
      while (myConn && fragNum >= myMeta.tracks[tid].missedFrags + myMeta.tracks[tid].fragments.size() - 1){
        //time out after 21 seconds
        if (++timeout > 42){
          myConn.close();
          break;
        }
        Util::sleep(500);
        updateMeta();
      }
      mstime = myMeta.tracks[tid].getKey(myMeta.tracks[tid].fragments[fragNum - myMeta.tracks[tid].missedFrags].getNumber()).getTime();
      mslen = myMeta.tracks[tid].fragments[fragNum - myMeta.tracks[tid].missedFrags].getDuration();
      VERYHIGH_MSG("Playing from %llu for %llu ms", mstime, mslen);
      
      selectedTracks.clear();
      selectedTracks.insert(tid);
      if (audioTrack){
        selectedTracks.insert(audioTrack);
      }
      seek(mstime);
      playUntil = mstime + mslen;
      
      H.Clean();
      H.SetHeader("Content-Type", "video/mp4");
      H.StartResponse(H, myConn);
      //send the bootstrap
      std::string bootstrap = dynamicBootstrap(tid);
      H.Chunkify(bootstrap, myConn);
      //send a zero-size mdat, meaning it stretches until end of file.
      H.Chunkify("\000\000\000\000mdat", 8, myConn);
      //send init data, if needed.
      if (audioTrack > 0 && myMeta.tracks[audioTrack].init != ""){
        if (tag.DTSCAudioInit(myMeta.tracks[audioTrack])){
          tag.tagTime(mstime);
          H.Chunkify(tag.data, tag.len, myConn);
        }
      }
      if (tid > 0){
        if (tag.DTSCVideoInit(myMeta.tracks[tid])){
          tag.tagTime(mstime);
          H.Chunkify(tag.data, tag.len, myConn);
        }
      }
      parseData = true;
      wantRequest = false;
    }else{
      initialize();
      std::stringstream tmpstr;
      myMeta.toPrettyString(tmpstr);
      H.Clean();
      H.SetHeader("Content-Type", "text/xml");
      H.SetHeader("Cache-Control", "no-cache");
      H.SetBody(dynamicIndex());
      H.SendResponse("200", "OK", myConn);
    }
  }
Esempio n. 29
0
bool KIso::openArchive(QIODevice::OpenMode mode)
{
    KISOFUNC;
    iso_vol_desc *desc;
    QString path, uid, gid;
    QT_STATBUF buf;
    int tracks[2*100], trackno = 0, i, access, c_b, c_i, c_j;
    KArchiveDirectory *root;
    struct iso_directory_record* idr;
    struct el_torito_boot_descriptor* bootdesc;

    if (mode == QIODevice::WriteOnly)
        return false;

    readParams();
    d->dirList.clear();

    tracks[0] = 0;
    if (m_startsec > 0) tracks[0] = m_startsec;
    //qDebug() << " m_startsec: " << m_startsec << endl;
    /* We'll use the permission and user/group of the 'host' file except
     * in Rock Ridge, where the permissions are stored on the file system
     */
    if (QT_STAT(m_filename.toLocal8Bit(), &buf) < 0) {
        /* defaults, if stat fails */
        memset(&buf, 0, sizeof(struct stat));
        buf.st_mode = 0777;
    } else {
        /* If it's a block device, try to query the track layout (for multisession) */
        if (m_startsec == -1 && S_ISBLK(buf.st_mode))
            trackno = getTracks(m_filename.toLatin1(), (int*) & tracks);
    }
    uid.setNum(buf.st_uid);
    gid.setNum(buf.st_gid);
    access = buf.st_mode & ~S_IFMT;

    //qDebug() << "KIso::openArchive number of tracks: " << trackno << endl;

    if (trackno == 0) trackno = 1;
    for (i = 0;i < trackno;++i) {

        c_b = 1;c_i = 1;c_j = 1;
        root = rootDir();
        if (trackno > 1) {
            path.clear();
            QTextStream(&path) << "Track " << tracks[(i<<1)+1];
            root = new KIsoDirectory(this, path, access | S_IFDIR,
                                     buf.st_mtime, buf.st_atime, buf.st_ctime, uid, gid, QString());
            rootDir()->addEntry(root);
        }

        desc = ReadISO9660(&readf, tracks[i<<1], this);
        if (!desc) {
            //qDebug() << "KIso::openArchive no volume descriptors" << endl;
            continue;
        }

        while (desc) {
            switch (isonum_711(desc->data.type)) {
            case ISO_VD_BOOT:

                bootdesc = (struct el_torito_boot_descriptor*) & (desc->data);
                if (!memcmp(EL_TORITO_ID, bootdesc->system_id, ISODCL(8, 39))) {
                    path = "El Torito Boot";
                    if (c_b > 1) path += " (" + QString::number(c_b) + ')';

                    dirent = new KIsoDirectory(this, path, access | S_IFDIR,
                                               buf.st_mtime, buf.st_atime, buf.st_ctime, uid, gid, QString());
                    root->addEntry(dirent);

                    addBoot(bootdesc);
                    c_b++;
                }
                break;

            case ISO_VD_PRIMARY:
            case ISO_VD_SUPPLEMENTARY:
                idr = (struct iso_directory_record*) & (((struct iso_primary_descriptor*) & desc->data)->root_directory_record);
                joliet = JolietLevel(&desc->data);
                if (joliet) {
                    QTextStream(&path) << "Joliet level " << joliet;
                    if (c_j > 1) path += " (" + QString::number(c_j) + ')';
                } else {
                    path = "ISO9660";
                    if (c_i > 1) path += " (" + QString::number(c_i) + ')';
                }
                dirent = new KIsoDirectory(this, path, access | S_IFDIR,
                                           buf.st_mtime, buf.st_atime, buf.st_ctime, uid, gid, QString());
                root->addEntry(dirent);
                level = 0;
                mycallb(idr, this);
                if (joliet) c_j++; else c_i++;
                break;
            }
            desc = desc->next;
        }
        free(desc);
    }
    device()->close();
    return true;
}