示例#1
0
/**
 * A track has ended. Remove it from the playlist.
 *
 * Called from the main loop when the music_delivery() callback has set g_playback_done.
 */
static void track_ended(void)
{
    fprintf(stderr,"jahspotify::track_ended: called\n");

    int tracks = 0;

    if (g_currenttrack)
    {
        sp_link *link = sp_link_create_from_track(g_currenttrack,0);
        char *trackLinkStr = NULL;
        if (link)
        {
            trackLinkStr = malloc ( sizeof ( char ) * ( 100 ) );
            sp_link_as_string(link,trackLinkStr,100);
            sp_link_release(link);
        }

        sp_session_player_unload(g_sess);

        sp_track_release(g_currenttrack);

        g_currenttrack = NULL;

        signalTrackEnded(trackLinkStr,JNI_FALSE);

        if (trackLinkStr)
        {
            free(trackLinkStr);
        }
    }


}
示例#2
0
	void Session::Unload( Track* pTrack )
	{
		if (pTrack && (pTrack == m_pTrack) )
		{
			sp_session_player_unload( m_pSession );
			m_pTrack = NULL;
		}
	}
示例#3
0
文件: main.c 项目: delrtye/Spot
static void on_end_of_track(sp_session *session)
{
	debug("callback: on_end_of_track");
	audio_fifo_flush(&g_audiofifo);
	sp_session_player_play(session, 0);
	sp_session_player_unload(session);
	printf("Done.\n\n");
	g_playing = 0;
}
示例#4
0
/**
 * Notification that some other connection has started playing on this account.
 * Playback has been stopped.
 *
 * @sa sp_session_callbacks#play_token_lost
 */
static void play_token_lost(sp_session *sess)
{
	audio_fifo_flush(&g_audiofifo);

	if (g_currenttrack != NULL) {
		sp_session_player_unload(g_sess);
		g_currenttrack = NULL;
	}
}
示例#5
0
/*---- Session Callbacks end ----*/
static void track_ended(void) {
	int tracks = 0;
	if(g_currenttrack) {
		g_currenttrack = NULL;
		sp_session_player_unload(g_sess);
		pop_queue();
		try_playback_start();
	}
}
示例#6
0
/**
 * Notification that some other connection has started playing on this account.
 * Playback has been stopped.
 *
 * @sa sp_session_callbacks#play_token_lost
 */
static void play_token_lost ( sp_session *sess )
{
    fprintf ( stderr, "jahspotify: play token lost\n" );
    if ( g_currenttrack != NULL )
    {
        sp_session_player_unload ( g_sess );
        g_currenttrack = NULL;
    }
}
示例#7
0
/**
 * Notification that some other connection has started playing on this account.
 * Playback has been stopped.
 *
 * @sa sp_session_callbacks#play_token_lost
 */
static void SP_CALLCONV play_token_lost(sp_session *sess)
{
    audio_flush();

    if (g_currenttrack != NULL) {
        sp_session_player_unload(g_sess);
        g_currenttrack = NULL;
    }
}
示例#8
0
/**
 * A track has ended. Remove it from the playlist.
 *
 * Called from the main loop when the music_delivery() callback has set g_playback_done.
 */
static void track_ended(void)
{
	if (g_currenttrack) {
		sp_track_release(g_currenttrack);
		g_currenttrack = NULL;
		sp_session_player_unload(g_sess);
		exit(0);
	}
}
void Spotify::tryLoadTrack()
{
    sp_error err;
    if (nextTrack == 0) {
        return;
    }

    if (currentTrack == nextTrack) {
        return;
    }

    err = sp_track_error(nextTrack);
    if (err != SP_ERROR_OK) {
        fprintf(stderr, "Spotify: track error: %s\n",
                sp_error_message(err));
        return;
    }

    err = sp_session_player_unload(sp);
    if (err != SP_ERROR_OK) {
        fprintf(stderr, "Failed to unload player: 0x%02X %s\n",
                (unsigned)err, sp_error_message(err));
        return;
    }

    if (audioThread.isRunning()) {
        audioThread.quit();
    }

    err = sp_session_player_load(sp, nextTrack);
    if (err != SP_ERROR_OK) {
        fprintf(stderr, "Failed to load URI (%s): 0x%02X %s\n",
                currentURI.toLocal8Bit().constData(),
                (unsigned)err, sp_error_message(err));
        return;
    }

    err = sp_session_player_play(sp, true);
    if (err != SP_ERROR_OK) {
        fprintf(stderr, "Failed to play URI (%s): %s\n",
                currentURI.toLocal8Bit().constData(),
                sp_error_message(err));
        return;
    }

    if (currentTrack) {
        sp_track_release(currentTrack);
    }
    currentTrack = nextTrack;

    emit songLoaded(currentURI);
}
void
SpotifyPlayback::endTrack()
{
    qDebug() << QThread::currentThreadId() << "And stopping track";
    if( !m_iodev.isNull() ) {

        qDebug() << "Stopping track and closign iodev! from thread with other:" << QThread::currentThreadId() << "and iodev:" << m_iodev->thread()->currentThreadId();
        m_iodev->close();
        m_iodev.clear();
        sp_session_player_unload(SpotifySession::getInstance()->Session());
    }
    m_trackEnded = true;
}
示例#11
0
Spotify::Error Spotify::Session::stop()
{
    Spotify::Error error;
    if( m_playing )
    {
        error = sp_session_player_play( m_session, false );
        if( !error.isError() )
        {
            sp_session_player_unload( m_session );
            m_playing = false;
        }
    }
    return error;
}
示例#12
0
/**
 * Callback from libspotify. Something renamed the playlist.
 *
 * @param  pl            The playlist handle
 * @param  userdata      The opaque pointer
 */
static void playlist_renamed(sp_playlist *pl, void *userdata)
{
	const char *name = sp_playlist_name(pl);

	if (!strcasecmp(name, g_listname)) {
		g_jukeboxlist = pl;
		g_track_index = 0;
		try_jukebox_start();
	} else if (g_jukeboxlist == pl) {
		printf("jukebox: current playlist renamed to \"%s\".\n", name);
		g_jukeboxlist = NULL;
		g_currenttrack = NULL;
		sp_session_player_unload(g_sess);
	}
}
示例#13
0
/**
 * A track has ended. Remove it from the playlist.
 *
 * Called from the main loop when the music_delivery() callback has set g_playback_done.
 */
static void track_ended(void)
{
	int tracks = 0;

	if (g_currenttrack) {
		g_currenttrack = NULL;
		sp_session_player_unload(g_sess);
		if (g_remove_tracks) {
			sp_playlist_remove_tracks(g_jukeboxlist, &tracks, 1);
		} else {
			++g_track_index;
			try_jukebox_start();
		}
	}
}
示例#14
0
// ----------------------------------------------------------------------------
//
void SpotifyEngine::_stopTrack( )
{
    if ( m_current_track != NULL ) {
        sp_session_player_unload( m_spotify_session );
        m_audio_out->cancel();
        m_current_track = NULL;
        m_current_track_link.Empty();
        m_track_state = TRACK_ENDED;
        m_track_length_ms = m_track_seek_ms = 0L;

        m_track_timer.stop( );

        removeTrackAnalyzer();
    }
}
示例#15
0
Spotify::Error Spotify::Session::play( Spotify::Track* track )
{
    m_playing = false;
    m_currentTrack = track;
    Spotify::Error error;

    // Clean up
    audio_fifo_flush(&m_audiofifo);
    sp_session_player_unload( m_session );

    // Disregard tracks that are not available:
    if( !track->isAvailable() )
    {
        qDebug() << "ERROR: Asked to play back a unavailable track..";
        return Spotify::Error( SP_ERROR_TRACK_NOT_PLAYABLE );
    }

    // Load track:
    error = load( track );
    if( error.isError() )
    {
        qDebug() << "ERROR: Could not load track: " << error.toString();
        return error;
    }

    // Disregard unloaded og unavailable tracks:
    if( !track->isLoaded() )
    {
        qDebug() << "ERROR: Asked to play back a unloaded track..";
        return Spotify::Error( SP_ERROR_RESOURCE_NOT_LOADED );
    }

    // Play track:
    error = sp_session_player_play( m_session, true );
    if( !error.isError() )
    {
        m_trackPos = 0;
        m_playing = true;
    }
    else
    {
        qDebug() << "ERROR: Could not play track: " << error.toString();
        return error;
    }
    return Spotify::Error( SP_ERROR_OK );
}
示例#16
0
void QSpotifySession::play(std::shared_ptr<QSpotifyTrack> track, bool restart)
{
    qDebug() << "QSpotifySession::play";
    if (track->error() != QSpotifyTrack::Ok || !track->isAvailable() || (m_currentTrack == track && !restart))
        return;

    if (m_currentTrack) {
        if (m_trackChangedAutomatically) {
            // We're done decoding the track, but we might not be done playing it
            m_previousTrackRemaining = m_currentTrack->duration() - m_currentTrackPosition;
        } else {
            m_previousTrackRemaining = 0;
        }
        sp_session_player_unload(m_sp_session);
        m_isPlaying = false;
        m_currentTrack.reset();
        m_currentTrackPosition = 0;
        m_currentTrackPlayedDuration = 0;
        // Only discard buffers if the track change was initialized manually
        // since we will otherwise potentially discard the end of the just played track
        if (!m_trackChangedAutomatically) {
            QCoreApplication::postEvent(g_audioWorker, new QEvent(QEvent::Type(ResetBufferEventType)));
        }
    } else {
        m_previousTrackRemaining = 0;
    }

    m_trackChangedAutomatically = false;

    if (!track->seen())
        track->setSeen(true);

    sp_error error = sp_session_player_load(m_sp_session, track->m_sp_track);
    if (error != SP_ERROR_OK) {
        fprintf(stderr, "failed to load track: %s\n",
                sp_error_message(error));
        return;
    }
    m_currentTrack = track;
    m_currentTrackPosition = 0;
    m_currentTrackPlayedDuration = 0;
    emit currentTrackChanged();
    emit currentTrackPositionChanged();

    beginPlayBack();
}
示例#17
0
  bool Codec::unloadPlayer() {
    //make sure there is no music_delivery while we are removing the codec
    while (!Session::getInstance()->lock()) {
    }
    if (m_isPlayerLoaded) {
      sp_session_player_play(getSession(), false);
      sp_session_player_unload(getSession());
      if (m_currentTrack != NULL) {
        sp_track_release(m_currentTrack);
      }
    }

    m_currentTrack = NULL;
    m_isPlayerLoaded = false;
    m_endOfTrack = true;
    Session::getInstance()->unlock();
    return true;
  }
示例#18
0
文件: spotify.c 项目: theodoor/spop
void session_unload() {
    session_callback_data scbd;

    g_debug("Unloading track.");

    /* First call callbacks */
    scbd.type = SPOP_SESSION_UNLOAD;
    scbd.data = NULL;
    g_list_foreach(g_session_callbacks, session_call_callback, &scbd);

    /* Then really unload */
    sp_session_player_play(g_session, FALSE);
    g_audio_delivery_func(NULL, NULL, 0);
    sp_session_player_unload(g_session);
    cb_notify_main_thread(NULL);
    g_audio_samples = 0;
    g_audio_time = 0;
}
示例#19
0
文件: player.c 项目: raphui/wMusic
void end_of_track( sp_session *session )
{
    TRACE_2( PLAYERMANAGER , "end_of_track().");

    TRACE_3( PLAYERMANAGER , "End of track...");

//    LOCK_MUTEX( PLAYERMANAGER , &mutexSession );

    TRACE_3( PLAYERMANAGER , "Removing the track which have been played.");

    sp_track_release( currentTrack );

//    UNLOCK_MUTEX( PLAYERMANAGER , &mutexSession );

//    if( hasNextTrack() == TRUE )
//    {
//        TRACE_1( PLAYERMANAGER , "Load next music !");

//        playMusic( session , "" , currentStreamName );
//    }
    if( nextTrackInStream( currentStreamName ) == PC_SUCCESS )
    {
        TRACE_1( PLAYERMANAGER , "Load next music !");

    }
    else
    {
        TRACE_WARNING( PLAYERMANAGER , "No more music in the mainplaylist");

        audio_fifo_flush( &g_audiofifo );

        LOCK_MUTEX( PLAYERMANAGER , &mutexSession );

        sp_session_player_play( session , 0 );
        sp_session_player_unload( session );

        UNLOCK_MUTEX( PLAYERMANAGER , &mutexSession );

        playing = FALSE;
    }



}
示例#20
0
// Loads track if metadata exists, otherwise load the metadata
static void load_track_or_metadata(sp_session *session, sp_track *track, const char *uri) {
	if (track != NULL) {
		if (s_is_playing)
			sp_session_player_play(session, false);
		sp_session_player_unload(session);
		sp_track_release(track);
	}
	track = sp_link_as_track(sp_link_create_from_string(uri));
	set_track(track);
	sp_track_add_ref(track);
	s_player_position = 0;
	s_current_uri = uri;

	// either the track is already cached and can be used or we need to wait for the metadata callback
	if (sp_track_is_loaded(track))
		load_and_play_track(session, track);
	else
		s_is_waiting_for_metadata = true;
}
示例#21
0
// Stop playback.
void sess_stop()
{
  if (g_session.state != SESS_ONLINE || !g_session.current_track || !sp_track_is_loaded(g_session.current_track))
    return;

  sp_session_player_unload(g_session.spotify);

  g_session.current_track = NULL;
  g_session.playing = false;
  g_session.paused = false;

  audio_clear_position();

  log_append("Stopped");

  // Redraw track info.
  ui_dirty(UI_TRACKINFO);
  ui_update_post(0);
}
示例#22
0
/**
 * Called on various events to start playback if it hasn't been started already.
 *
 * The function simply starts playing the first track of the playlist.
 */
static void try_jukebox_start(void)
{
	sp_track *t;

	if (!g_jukeboxlist)
		return;

	if (!sp_playlist_num_tracks(g_jukeboxlist)) {
		fprintf(stderr, "jukebox: No tracks in playlist. Waiting\n");
		return;
	}

	if (sp_playlist_num_tracks(g_jukeboxlist) < g_track_index) {
		fprintf(stderr, "jukebox: No more tracks in playlist. Waiting\n");
		return;
	}

	t = sp_playlist_track(g_jukeboxlist, g_track_index);

	if (g_currenttrack && t != g_currenttrack) {
		/* Someone changed the current track */
		audio_fifo_flush(&g_audiofifo);
		sp_session_player_unload(g_sess);
		g_currenttrack = NULL;
	}

	if (!t)
		return;

	if (sp_track_error(t) != SP_ERROR_OK)
		return;

	if (g_currenttrack == t)
		return;

	g_currenttrack = t;

	printf("jukebox: Now playing \"%s\"...\n", sp_track_name(t));
	fflush(stdout);

	sp_session_player_load(g_sess, t);
	sp_session_player_play(g_sess, 1);
}
示例#23
0
static void try_playback_start(void) {
	sp_track *t;
	if(amtSongs() == 0) {
		fprintf(stderr, "Playlist: No tracks in playlist. Waiting\n");
		return;
	}
	t = sp_link_as_track(firstSong->song);
	if(g_currenttrack && t != g_currenttrack) {
		audio_fifo_flush(&g_audiofifo);
		sp_session_player_unload(g_sess);
		g_currenttrack = NULL;
	}
	
	if(!t) {
		printf("Null Song\n");
		fflush(stdout);
		return;
	}
	int next_timeout = 0;
	sp_session_process_events(g_sess, &next_timeout);
	while(sp_track_error(t) != SP_ERROR_OK) {
		sp_session_process_events(g_sess, &next_timeout);
	   	printf("Loading Track...\n");
        usleep(100000);
	}
	if(sp_track_error(t) != SP_ERROR_OK) {
		printf("SP_ERRoR\n");
		printf("%i\n", sp_track_error(t));
		fflush(stdout);
		return;
	}
	if(g_currenttrack == t) {
		printf("Coninuting same track\n");
		fflush(stdout);
		return;
	}
	g_currenttrack = t;
	printf("Partyfy: Now playing \"%s\"...\n", sp_track_name(t));
	fflush(stdout);
	sp_session_player_load(g_sess, t);
	sp_session_player_play(g_sess, 1);
}
示例#24
0
void QSpotifySession::stop(bool dontEmitSignals)
{
    qDebug() << "QSpotifySession::stop";
    if (!m_isPlaying && !m_currentTrack)
        return;

    sp_session_player_unload(m_sp_session);
    m_isPlaying = false;
    m_currentTrack.reset();
    m_currentTrackPosition = 0;
    m_currentTrackPlayedDuration = 0;

    if (!dontEmitSignals) {
        emit isPlayingChanged();
        emit currentTrackChanged();
        emit currentTrackPositionChanged();
    }

    QCoreApplication::postEvent(g_audioWorker, new QEvent(QEvent::Type(AudioStopEventType)));
}
示例#25
0
static int spfs_open(const char *path, struct fuse_file_info *fi)
{
  file_t *file = find_file(path + 1);
  if(!file)
    return -ENOENT;

  if(!track_ended)
    sp_session_player_unload(session);  

  printf("Spotify: Loading %s by %s\n", sp_track_name(file->track), sp_artist_name(sp_track_artist(file->track, 0)));

  sp_session_player_load(session, file->track);
  sp_session_player_play(session, 1);

  write_wav_header(frame_buf);
  frame_buf_size = 44;

  track_ended = 0;
  
  return 0;
}
示例#26
0
/**
 * A track has ended. Remove it from the playlist.
 *
 * Called from the main loop when the music_delivery() callback has set g_playback_done.
 */
static void track_ended(bool startNext) {
	printf("track_ended startNext=%d\n", startNext);
	int tracks = 0;
	if (g_currenttrack) {
		printf("track_ended: stopping current track.\n");
		g_currenttrack = NULL;
		sp_session_player_unload(g_sess);
		g_is_playing = 0;
	}
	audio_fifo_flush(&g_musicfifo);
	notify_main_thread(g_sess);
	audio_fifo_flush(&g_musicfifo);
	usleep(50000);
	if (startNext) {
		printf("track_ended: play next track.\n");
		try_jukebox_start();
		usleep(50000);
		notify_main_thread(g_sess);
				banner_track();
	}
}
示例#27
0
static PyObject *
Session_unload(PyObject *self)
{
    sp_session_player_unload(Session_SP_SESSION(self));
    Py_RETURN_NONE;
}
示例#28
0
void Spotify::run()
{
    int next_timeout = 0;

    sp = spotify_ll_init(Spotify_Wrapper::sessionCallbacks());
    if (!sp) {
        return;
    }

    bool running = true;
    while (running) {
        SpotifyEvent_t ev = EVENT_NO_EVENT;
        // Get next event (or timeout)
        if (next_timeout == 0) {
            eq.get(ev);
        } else {
            if (!eq.get(ev, next_timeout)) {
                // Timed out
                ev = EVENT_TIMEOUT;
            }
        }

        switch (ev) {
        case EVENT_SPOTIFY_MAIN_TICK:
        case EVENT_TIMEOUT:
            break;

        case EVENT_LOGIN_CREDENTIALS_CHANGED:
            if (pass.isEmpty()) {
                // Try using credential blob
                sp_session_login(sp,
                                 user.toLocal8Bit().constData(),
                                 NULL,
                                 false,
                                 blob.constData());
            }
            else {
                sp_session_login(sp,
                                 user.toLocal8Bit().constData(),
                                 pass.toLocal8Bit().constData(),
                                 false,
                                 NULL);
            }
            break;

        case EVENT_LOGGED_IN:
            emit loggedIn();
            break;

        case EVENT_PLAYLIST_CONTAINER_LOADED:
            compileNewListOfPlaylists();
            break;

        case EVENT_LOGGED_OUT:
            emit loggedOut();
            break;

        case EVENT_URI_CHANGED:
            changeCurrentlyPlayingSong();
            break;

        case EVENT_PLAYLIST_IDX_CHANGED:
            changeCurrentPlaylist();
            break;

        case EVENT_METADATA_UPDATED:
            tryLoadTrack();
            break;

        case EVENT_START_PLAYBACK:
            if (!audioThread.isRunning()) {
                fprintf(stderr, "Spotify: Starting audio worker\n");

                SpotifyAudioWorker * audioWorker = new SpotifyAudioWorker(this);
                audioWorker->moveToThread(&audioThread);
                connect(&audioThread, SIGNAL(started()),
                        audioWorker, SLOT(startStreaming()));
                connect(&audioThread, SIGNAL(finished()),
                        audioWorker, SLOT(stopStreaming()));
                connect(&audioThread, SIGNAL(finished()),
                        audioWorker, SLOT(deleteLater()));
                connect(audioWorker, SIGNAL(streamingFailed()),
                        this, SIGNAL(audioStreamingFailed()));
                audioThread.start();
            }
            break;

        case EVENT_STOP_PLAYBACK:
            if (audioThread.isRunning()) {
                audioThread.quit();
                audioThread.wait();
            }
            accessMutex.lock();
            audioBuffer.close();
            readPos = 0;
            writePos = 0;
            accessMutex.unlock();
            break;

        case EVENT_END_OF_TRACK:
            sp_session_player_unload(sp);
            sp_track_release(currentTrack);
            currentURI.clear();
            nextTrack = 0;
            currentTrack = 0;
            break;

        default:
            qDebug() << "Unknown event:" << (int)ev;
            break;
        }

        do {
            sp_session_process_events(sp, &next_timeout);
        } while (next_timeout == 0);
    }
}
示例#29
0
/**
 * Notification that some other connection has started playing on this account.
 * Playback has been stopped.
 *
 * @sa sp_session_callbacks#play_token_lost
 */
static void play_token_lost(sp_session *sess)
{
  sp_session_player_unload(sess);
}
示例#30
0
static PyObject *
Session_unload(Session * self)
{
    sp_session_player_unload(self->_session);
    Py_RETURN_NONE;
}