示例#1
0
void	CTestPage::StopPlayback( void )
/////////////////////////////////////////////////////////////////////////////
{
	PHALWAVEDEVICE	pHD;

	if( m_nPlayMode != MODE_RUN )
		return;

	DPF(("Stopping Play Device %d\n", m_nPlayDevice ));

	pHD = m_pHalAdapter->GetWaveOutDevice( m_nPlayDevice );

	//DPF(("Stop\n"));
	if( pHD->Stop() )
	{
		DPF(("Stop Failed!\n"));
	}

	m_nPlayMode = MODE_STOP;

	m_WavePlayFile.Close();

	free( m_pPlayBuffer );
	ReleasePhysicalPages( m_pPlayBuffer, m_ulPlayBufferSize, m_ulPlayBufferPages );

	// change the button to play
	SetDlgItemText( IDC_PLAY, "Play" );
	SetDlgItemText( IDC_PLAY_SAMPLECOUNT, "" );

	if( m_bRepeat )
		StartPlayback();
}
void SpotifyServer::StartPlaybackLater(const QString& uri, quint16 port) {
  QTimer* timer = new QTimer(this);
  connect(timer, SIGNAL(timeout()), timer, SLOT(deleteLater()));

  timer->start(100);  // lol
  NewClosure(timer, SIGNAL(timeout()), this,
             SLOT(StartPlayback(QString, quint16)), uri, port);
}
示例#3
0
void CTestPage::OnPlay() 
/////////////////////////////////////////////////////////////////////////////
{
	static char BASED_CODE szFilter[] = "Wave Files(*.wav)|*.wav|All Files(*.*)|*.*||";
	char	szInitialDir[ _MAX_PATH ];
	char	szFileName[ _MAX_PATH ];

	UpdateData( TRUE );	// Get data from the controls

	if( !m_pHalAdapter->IsOpen() )
	{
		MessageBox( "Must Open Adapter First!" );
		return;
	}

 	if( m_nPlayMode == MODE_STOP )
	{
		// Pop up the file dialog box
		CFileDialog	dlg( TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_PATHMUSTEXIST, szFilter, this );

		if( m_szFileName[0] )
		{
			char	szDrive[ _MAX_DRIVE ];
			char	szDir[ _MAX_DIR ];
			char	szBaseName[ _MAX_FNAME ];
			char	szExt[ _MAX_EXT ];

			_splitpath( m_szFileName, szDrive, szDir, szBaseName, szExt );
			sprintf( szInitialDir, "%s%s", szDrive, szDir );
			sprintf( szFileName, "%s%s", szBaseName, szExt );
			
			dlg.m_ofn.lpstrInitialDir = szInitialDir;
			dlg.m_ofn.lpstrFile = szFileName;
		}
		else
			dlg.m_ofn.lpstrInitialDir = "D:\\Audio";

		if( dlg.DoModal() == IDCANCEL )
			return;

		CString	PathName;
		PathName = dlg.GetPathName();
		strcpy( m_szFileName, PathName.GetBuffer( _MAX_PATH - 1 ) );
		PathName.ReleaseBuffer();
		
		StartPlayback();
	}
	else
	{
		m_bRepeat = FALSE;
		UpdateData(FALSE);	// Send data to the controls
		StopPlayback();
	}
}
示例#4
0
UINT8 PlayMusic(VGM_FILE* vgmFile)
{
	VGM_PBK* vgmPb = &vgmPbMusic;

	if (! vgmPb->vgmEnd)
		StopPlayback(vgmPb);

	vgmPb->file = vgmFile;

	StartPlayback(vgmPb);

	return 0x00;
}
示例#5
0
文件: player.cpp 项目: sfpgmr/2dx
    //  Start playback from paused or stopped.
    void Player_::play( ev::Play const& ev)
    {
 /*     if (m_state != Paused && m_state != Stopped)
      {
        THROW_IF_ERR(MF_E_INVALIDREQUEST);
      }*/
      if (!m_pSession || !m_pSource)
      {
        THROW_IF_ERR(E_UNEXPECTED);
      }
      StartPlayback();
      OnStart()(static_cast<this_type&>(*this));
    }
示例#6
0
void
MythPianoService::NextSong()
{
    StopPlayback();

    if (m_Playlist != NULL) {
      m_CurrentSong = m_CurrentSong->next;
    }

    if (m_CurrentSong == NULL) {
      GetPlaylist();
    }

    StartPlayback();
}
HRESULT CPlayer::OnTopologyStatus(IMFMediaEvent *pEvent)
{
	UINT32 status;

	HRESULT hr = pEvent->GetUINT32(MF_EVENT_TOPOLOGY_STATUS, &status);
	if (SUCCEEDED(hr) && (status == MF_TOPOSTATUS_READY))
	{
		SafeRelease(&m_pVideoDisplay);


		hr = StartPlayback();
		hr = Pause();
	}
	return hr;
}
/** Pauses playback */
void FImfVideoPlayer::PausePlayback( bool Pause )
{
	/* TODO: */
	/* Not every media source can pause. If a media source can pause, the IMFMediaSource::GetCharacteristics method returns the MFMEDIASOURCE_CAN_PAUSE flag. */

	HRESULT HResult = S_OK;
	if( Pause )
	{
		HResult = MediaSession->Pause( );
		check( SUCCEEDED( HResult ) );
	}
	else
	{
		StartPlayback( );
	}
}
示例#9
0
void
MythPianoService::heartbeat(void)
{
  if (m_Player.mode >= audioPlayer::PLAYER_FINISHED_PLAYBACK ||
      m_Player.mode == audioPlayer::PLAYER_FREED) {

    if (m_Playlist != NULL) {
      m_CurrentSong = m_CurrentSong->next;
    }

    if (m_CurrentSong == NULL) {
      GetPlaylist();
    }

    StartPlayback();
  }
}
示例#10
0
HRESULT CPlayer::Play()
{
    TRACE((L"CPlayer::Play\n"));

    if (m_state != Paused && m_state != Stopped)
    {
        return MF_E_INVALIDREQUEST;
    }
    if (m_pSession == NULL || m_pSource == NULL)
    {
        return E_UNEXPECTED;
    }

    HRESULT hr = StartPlayback();

    return hr;
}
示例#11
0
UINT8 PlaySFX(VGM_FILE* vgmFile, UINT8 sfxChnID)
{
	VGM_PBK* vgmPb;

	if (sfxChnID >= SFX_CHN_COUNT)
		return 0xFF;

	vgmPb = &vgmPbSFX[sfxChnID];

	if (! vgmPb->vgmEnd)
		StopPlayback(vgmPb);

	vgmPb->file = vgmFile;

	StartPlayback(vgmPb);

	return 0x00;
}
示例#12
0
HRESULT CPlayer::OnTopologyReady(IMFMediaEvent *pEvent)
{
    TRACE((L"CPlayer::OnTopologyReady\n"));

    // Ask for the IMFVideoDisplayControl interface.
    // This interface is implemented by the EVR and is
    // exposed by the media session as a service.

    // Note: This call is expected to fail if the source
    // does not have video.

    MFGetService(
        m_pSession,
        MR_VIDEO_RENDER_SERVICE,
        __uuidof(IMFVideoDisplayControl),
        (void**)&m_pVideoDisplay
        );

    HRESULT hr = StartPlayback();

    return S_OK;
}
示例#13
0
void MIDIStreamer::Play(bool looping, int subsong)
{
	DWORD tid;
	EMidiDevice devtype;

	m_Status = STATE_Stopped;
	m_Looping = looping;
	EndQueued = 0;
	VolumeChanged = false;
	Restarting = true;
	InitialPlayback = true;

	assert(MIDI == NULL);
	devtype = SelectMIDIDevice(DeviceType);
	if (DumpFilename.IsNotEmpty())
	{
		if (devtype == MDEV_GUS)
		{
			MIDI = new TimidityWaveWriterMIDIDevice(DumpFilename, 0);
		}
	}
	else
	{
		MIDI = CreateMIDIDevice(devtype);
	}
	
#ifndef _WIN32
	assert(MIDI == NULL || MIDI->NeedThreadedCallback() == false);
#endif

	if (MIDI == NULL || 0 != MIDI->Open(Callback, this))
	{
		Printf(PRINT_BOLD, "Could not open MIDI out device\n");
		return;
	}

	SetMIDISubsong(subsong);
	CheckCaps(MIDI->GetTechnology());

	if (MIDI->Preprocess(this, looping))
	{
		StartPlayback();
		if (MIDI == NULL)
		{ // The MIDI file had no content and has been automatically closed.
			return;
		}
	}

	if (0 != MIDI->Resume())
	{
		Printf ("Starting MIDI playback failed\n");
		Stop();
	}
	else
	{
#ifdef _WIN32
		if (MIDI->NeedThreadedCallback())
		{
			PlayerThread = CreateThread(NULL, 0, PlayerProc, this, 0, &tid);
			if (PlayerThread == NULL)
			{
				Printf ("Creating MIDI thread failed\n");
				Stop();
			}
			else
			{
				m_Status = STATE_Playing;
			}
		}
		else
#endif
		{
			m_Status = STATE_Playing;
		}
	}
}
示例#14
0
void VDAudioOutputDirectSoundW32::ThreadRun() {
	if (!InitDirectSound()) {
		ShutdownDirectSound();
		mMutex.Lock();
		mbThreadInited = true;
		mbThreadInitSucceeded = false;
		mMutex.Unlock();
		mUpdateEvent.signal();
		return;
	}

	ThreadState threadState = kThreadStateStop;
	uint32 lastInitCount = 0;
	bool underflow = false;
	bool playing = false;
	uint32 dsStreamWritePosition = 0;

	if (!InitPlayback()) {
		ShutdownDirectSound();

		mMutex.Lock();
		mbThreadInited = true;
		mbThreadInitSucceeded = false;
		mMutex.Unlock();
		mUpdateEvent.signal();
		return;
	}

	mMutex.Lock();
	mbThreadInited = true;
	mbThreadInitSucceeded = true;
	mUpdateEvent.signal();
	mMutex.Unlock();

	for(;;) {
		if (playing)
			mUpdateEvent.tryWait(10);
		else
			mUpdateEvent.wait();

		mMutex.Lock();
		threadState = (ThreadState)mThreadState;
		mMutex.Unlock();

		if (threadState == kThreadStatePlay) {
			if (!underflow) {
				StartPlayback();
				playing = true;
			}
		} else {
			StopPlayback();
			playing = false;
		}

		if (threadState == kThreadStateExit)
			break;

		if (!playing)
			continue;

		Cursors cursors;
		if (!ReadCursors(cursors))
			continue;

		uint32 level;
		mMutex.Lock();
		level = mBufferLevel;

		// Compute current buffering level.
		sint32 bufferedLevel = mDSWriteCursor - cursors.mPlayCursor;
		if (bufferedLevel > (sint32)mDSBufferSizeHalf)
			bufferedLevel -= mDSBufferSize;
		else if (bufferedLevel < -(sint32)mDSBufferSizeHalf)
			bufferedLevel += mDSBufferSize;

		if (bufferedLevel < 0) {
			bufferedLevel = 0;
			mDSWriteCursor = cursors.mWriteCursor;
		}

		// Compute the stream play position. This should never go backward. If it
		// has, we have underflowed.
		uint32 newDSStreamPlayPos = dsStreamWritePosition - bufferedLevel;

		if (newDSStreamPlayPos < mDSStreamPlayPosition) {
			mDSStreamPlayPosition = dsStreamWritePosition;
			bufferedLevel = 0;
		}

		mDSBufferedBytes = bufferedLevel;

		mMutex.Unlock();

		if (!level) {
			if (!underflow && playing) {
				// Check for underflow.
				if (!bufferedLevel) {
					StopPlayback();
					playing = false;
				}
			}

			continue;
		}

		// compute how many bytes to copy
		uint32 toCopy = level;
		if (toCopy + bufferedLevel > mDSBufferSizeHalf)
			toCopy = mDSBufferSizeHalf - bufferedLevel;

		if (!toCopy)
			continue;

		// update local write position
		dsStreamWritePosition += toCopy;

		// lock and copy into DirectSound buffer
		const uint8 *src = mBuffer.data();
		uint32 consumed = 0;
		while(toCopy > 0) {
			const uint32 tc2 = std::min<uint32>(toCopy, mBufferSize - mBufferReadOffset);
			const uint32 tc3 = std::min<uint32>(tc2, mDSBufferSize - mDSWriteCursor);

			WriteAudio(mDSWriteCursor, src + mBufferReadOffset, tc3);
			mBufferReadOffset += tc3;
			if (mBufferReadOffset >= mBufferSize)
				mBufferReadOffset = 0;

			mDSWriteCursor += tc3;
			if (mDSWriteCursor >= mDSBufferSize)
				mDSWriteCursor = 0;

			toCopy -= tc3;
			consumed += tc3;
		}

		mMutex.Lock();
		mBufferLevel -= consumed;
		mMutex.Unlock();

		// restart playback if we were in underflow state
		if (underflow && !playing) {
			underflow = false;
			playing = true;

			StartPlayback();
		}

		mResponseEvent.signal();
	}

	ShutdownPlayback();
	ShutdownDirectSound();
}
/** Asyncronous callback */
HRESULT FImfVideoPlayer::Invoke( IMFAsyncResult* AsyncResult )
{
	IMFMediaEvent* Event = NULL;
	HRESULT HResult = MediaSession->EndGetEvent( AsyncResult, &Event );

	if( FAILED( HResult ) )
	{
		Event->Release( );
		return S_OK;
	}

	MediaEventType EventType = MEUnknown;
	HResult = Event->GetType( &EventType );
	//Moving lower because it is referenced below to GetStatus if there was a problem: Event->Release( );

	if( FAILED( HResult ) )
	{
		Event->Release( );
		return S_OK;
	}

	/* Closed */
	if( EventType == MESessionClosed )
	{
		MovieIsFinished.Set( 1 );
		CloseIsPosted.Set( 1 );
	}
	else
	{
		HResult = MediaSession->BeginGetEvent( this, NULL );
		if( FAILED( HResult ) )
		{
			Event->Release( );
			return S_OK;
		}

		if( MovieIsRunning( ) )
		{
			/* End of clip */
			if( EventType == MEEndOfPresentation )
			{
				if( Looping )
					StartPlayback( );
				else
					MovieIsFinished.Set( 1 );
			}

			/* Unknown error, dont continue */
			else if( EventType == MEError )
			{
				HRESULT HReturnCode = S_OK;
				Event->GetStatus( &HReturnCode );

				/* Log error HResult */
				UE_LOG( LogImfVideoPlayer, Log, TEXT( "ImfVideoPlayer error recieved: %i" ), HReturnCode );

				MovieIsFinished.Set( 1 );
				CloseIsPosted.Set( 1 );
			}
		}

		/* DEBUG: Displays all event ID's in log */
		//UE_LOG( LogImfVideoPlayer, Log, TEXT( "ImfVideoPlayer event id: %i" ), EventType );
	}
	
	Event->Release( );

	return S_OK;
}