示例#1
0
			virtual ~LocalServer(void)
			{
				QuitAndWait();

				// Clear the connection flags...
				AtomicExchange(g_connectionFlags, (UInt32)0);

				if(g_onDisconnect)
				{
					// After the connection is fully shut down, notify the app.
					g_onDisconnect();
				}

				// Clear the buffers for all AsyncStreams to guarantee that no event is 
				// stalled waiting for room on a buffer. Then we wait until there there
				// are no events still writing out.
				AsyncStream::ClearAll();
				while(AtomicGet(g_refcount) > 0)
				{
					ThreadSleepMilliseconds(1);
				}

				// Finally, release any AsyncStreams that were created during this session
				// now that we can safely assume there are no events actively trying to
				// write out to a stream.
				AsyncStream::Shutdown();

				g_varStore.Clear();

				if(m_file != NullFileHandle)
				{
					CloseFile(m_file);
					m_file = NullFileHandle;
				}
			}
示例#2
0
void OpenSLContext::resume() {
	lock();

	if (AtomicExchange(&paused, false)) {
		for (int i = 0; i < OPENSL_CHANNELS; i++) {
			OpenSLPlayer *player = AtomicGet(&(players[i]));
			if (player != NULL) {
				player->lock();
				player->restore();
				player->unlock();
			}
		}
	}

	unlock();
}
示例#3
0
void OpenSLPlayer::restore() {
	lock();

	accessTime = currentTimeMillis();

	if (player == NULL) {
		unlock();

		return;
	}

	if (isPaused() && AtomicExchange(&resume, false)) {
		if (AtomicExchange(&reset, false)) (*playerSeek)->SetPosition(playerSeek, 0, SL_SEEKMODE_FAST);
		(*playerSeek)->SetLoop(playerSeek, AtomicGet(&loop) ? SL_BOOLEAN_TRUE : SL_BOOLEAN_FALSE, 0, SL_TIME_UNKNOWN);
		(*player)->SetPlayState(player, SL_PLAYSTATE_PLAYING);

		AtomicSet(&state, SL_PLAYSTATE_PLAYING);
	}

	unlock();
}
示例#4
0
void OpenSLContext::pause() {
	lock();

	if (!AtomicExchange(&paused, true)) {
		for (int i = 0; i < OPENSL_CHANNELS; i++) {
			OpenSLPlayer *player = AtomicGet(&(players[i]));
			if (player != NULL) {
				player->lock();

				if (player->isPlaying()) {
					player->pause();
					AtomicSet(&player->resume, true);
				}

				player->unlock();
			}
		}
	}

	unlock();
}
示例#5
0
void OpenSLPlayer::setSound(OpenSLSound* sound) {
	lock();

	clear();

	SLresult result;

	locatorFD.locatorType = SL_DATALOCATOR_ANDROIDFD;
	locatorFD.fd = AtomicGet(&sound->fd);
	locatorFD.offset = 0;
	locatorFD.length = AtomicGet(&sound->fileSize);

	formatMIME.formatType = SL_DATAFORMAT_MIME;
	formatMIME.mimeType = NULL;
	formatMIME.containerType = SL_CONTAINERTYPE_UNSPECIFIED;

	audioSrc.pLocator = &locatorFD;
	audioSrc.pFormat = &formatMIME;

	locatorOutMix.locatorType = SL_DATALOCATOR_OUTPUTMIX;
	locatorOutMix.outputMix = context->outputMixObj;

	audioSnk.pLocator = (void*)&locatorOutMix;
	audioSnk.pFormat = NULL;

	const SLInterfaceID ids[4] = {SL_IID_SEEK, SL_IID_MUTESOLO, SL_IID_VOLUME};
	const SLboolean req[4] = {SL_BOOLEAN_TRUE, SL_BOOLEAN_TRUE, SL_BOOLEAN_TRUE};

	result = (*context->engine)->CreateAudioPlayer(context->engine, &playerObj, &audioSrc, &audioSnk, 3, ids, req);
	if (result != SL_RESULT_SUCCESS) {
		playerObj = NULL;
		unlock();
		return;
	}

	result = (*playerObj)->Realize(playerObj, SL_BOOLEAN_FALSE);
	if (result != SL_RESULT_SUCCESS) {
		playerObj = NULL;
		unlock();
		return;
	}

	result = (*playerObj)->GetInterface(playerObj, SL_IID_PLAY, &player);
	if (result != SL_RESULT_SUCCESS) {
		clear();
		unlock();
		return;
	}

	result = (*playerObj)->GetInterface(playerObj, SL_IID_SEEK, &playerSeek);
	if (result != SL_RESULT_SUCCESS) {
		clear();
		unlock();
		return;
	}

	result = (*playerObj)->GetInterface(playerObj, SL_IID_MUTESOLO, &playerMuteSolo);
	if (result != SL_RESULT_SUCCESS) {
		clear();
		unlock();
		return;
	}

	result = (*playerObj)->GetInterface(playerObj, SL_IID_VOLUME, &playerVolume);
	if (result != SL_RESULT_SUCCESS) {
		clear();
		unlock();
		return;
	}

	result = (*player)->RegisterCallback(player, EventCallback, (void*)this);
	if (result != SL_RESULT_SUCCESS) {
		clear();
		unlock();
		return;
	}

	result = (*player)->SetCallbackEventsMask(player, SL_PLAYEVENT_HEADATEND/* | SL_PLAYEVENT_HEADATMARKER | SL_PLAYEVENT_HEADATNEWPOS | SL_PLAYEVENT_HEADMOVING | SL_PLAYEVENT_HEADSTALLED*/);
	if (result != SL_RESULT_SUCCESS) {
		clear();
		unlock();
		return;
	}

	AtomicSetPtr(&(this->sound), sound);

	accessTime = currentTimeMillis();

	unlock();
}
示例#6
0
bool OpenSLPlayer::isStopped() {
	return AtomicGet(&state) == SL_PLAYSTATE_STOPPED;
}
示例#7
0
bool OpenSLPlayer::isPaused() {
	return AtomicGet(&state) == SL_PLAYSTATE_PAUSED;
}
示例#8
0
bool OpenSLPlayer::isPlaying() {
	return AtomicGet(&state) == SL_PLAYSTATE_PLAYING;
}
示例#9
0
	int get() const
	{
		return AtomicGet(m_count);
	}
示例#10
0
 // Check to see if (a) a connection is established and (b) that a particular capture feature is enabled on the connection.
 bool CheckConnectionFlag(CaptureFlag feature)
 {
     return (AtomicGet(g_connectionFlags) & feature) != 0;
 }
示例#11
0
 // Indicates that the capture system is currently connected...
 bool IsConnected(void)
 {
     return AtomicGet(g_connectionFlags) != 0;
 }
示例#12
0
OpenSLPlayer* OpenSLContext::getFreePlayer(OpenSLSound* sound) {
	lock();

	int empty = -1;
	int old_index = -1;
	uint64_t old_access = 0;

OpenSLContext_getFreePlayer_repeat:

	for (int i = 0; i < OPENSL_CHANNELS; i++) {
		OpenSLPlayer *player = AtomicGet(&(players[i]));
		if (player == NULL) {
			empty = i;
		} else {
			player->lock();

			if ((old_access == 0) || (player->accessTime <= old_access)) {
				old_index = i;
				old_access = player->accessTime;
			}

			if (player->isStopped()) {
				unlock();

				AtomicSet(&player->resume, false);
				return player;
			}

			player->unlock();
		}
	}

	if (empty >= 0) {
		OpenSLPlayer *player;
		AtomicSet(&(players[empty]), player = new OpenSLPlayer(this));

		player->lock();
		unlock();

		return player;
	}

	if (old_index >= 0) {
		OpenSLPlayer *player = AtomicGet(&(players[old_index]));
		if (player != NULL) {
			player->lock();

			if (player->isPlaying()) {
				player->stop();
			}

			AtomicSet(&player->resume, false);

			unlock();

			return player;
		}
	}

	goto OpenSLContext_getFreePlayer_repeat;
}
示例#13
0
bool OpenSLContext::isPaused() {
	return AtomicGet(&paused);
}
bool Thread::QuitSignaled(void)
{
    return AtomicGet(m_quitSignaled) ? true : false;
}
示例#15
0
			virtual void OnThreadExecute(void)
			{
				SetThreadName("CaptureServer");

				// Acquire the process name...
			#if defined(OVR_CAPTURE_WINDOWS)
				char packageName[64] = {0};
				GetModuleFileNameA(NULL, packageName, sizeof(packageName));
				if(!packageName[0])
				{
					StringCopy(packageName, "Unknown", sizeof(packageName));
				}
			#else
				char packageName[64] = {0};
				char cmdlinepath[64] = {0};
				FormatString(cmdlinepath, sizeof(cmdlinepath), "/proc/%u/cmdline", (unsigned)getpid());
				if(ReadFileLine(cmdlinepath, packageName, sizeof(packageName)) <= 0)
				{
					StringCopy(packageName, "Unknown", sizeof(packageName));
				}
			#endif

				while(m_listenSocket && !QuitSignaled())
				{
					// Start auto-discovery thread...
					ZeroConfigHost *zeroconfig = ZeroConfigHost::Create(g_zeroConfigPort, m_listenPort, packageName);
					zeroconfig->Start();

					// try and accept a new socket connection...
					SocketAddress streamAddr;
					m_streamSocket = m_listenSocket->Accept(streamAddr);

					// Once connected, shut the auto-discovery thread down.
					zeroconfig->Release();

					// If no connection was established, something went totally wrong and we should just abort...
					if(!m_streamSocket)
						break;

					// Before we start sending capture data... first must exchange connection headers...
					// First attempt to read in the request header from the Client...
					ConnectionHeaderPacket clientHeader = {0};
					if(!m_streamSocket->Receive(&clientHeader, sizeof(clientHeader)))
					{
						m_streamSocket->Release();
						m_streamSocket = NULL;
						continue;
					}

					// Load our connection flags...
					const UInt32 connectionFlags = clientHeader.flags & g_initFlags;

					// Build and send return header... We *always* send the return header so that if we don't
					// like something (like version number or feature flags), the client has some hint as to
					// what we didn't like.
					ConnectionHeaderPacket serverHeader = {0};
					serverHeader.size    = sizeof(serverHeader);
					serverHeader.version = ConnectionHeaderPacket::s_version;
					serverHeader.flags   = connectionFlags;
					if(!m_streamSocket->Send(&serverHeader, sizeof(serverHeader)))
					{
						m_streamSocket->Release();
						m_streamSocket = NULL;
						continue;
					}

					// Check version number...
					if(clientHeader.version != serverHeader.version)
					{
						m_streamSocket->Release();
						m_streamSocket = NULL;
						continue;
					}

					// Check that we have any capture features even turned on...
					if(!connectionFlags)
					{
						m_streamSocket->Release();
						m_streamSocket = NULL;
						continue;
					}

					// Finally, send our packet descriptors...
					const PacketDescriptorHeaderPacket packetDescHeader = { g_numPacketDescs };
					if(!m_streamSocket->Send(&packetDescHeader, sizeof(packetDescHeader)))
					{
						m_streamSocket->Release();
						m_streamSocket = NULL;
						continue;
					}
					if(!m_streamSocket->Send(&g_packetDescs, sizeof(g_packetDescs)))
					{
						m_streamSocket->Release();
						m_streamSocket = NULL;
						continue;
					}

					// Connection established!

					// Initialize the per-thread stream system before flipping on g_connectionFlags...
					AsyncStream::Init();

					if(g_onConnect)
					{
						// Call back into the app to notify a connection is being established.
						// We intentionally do this before enabling the connection flags.
						g_onConnect(connectionFlags);
					}

					// Signal that we are connected!
					AtomicExchange(g_connectionFlags, connectionFlags);

					// Technically any Labels that get initialized on another thread bettween the barrier and loop
					// will get sent over the network twice, but OVRMonitor will handle that.
					g_labelLock.Lock();
					for(Label *l=Label::GetHead(); l; l=l->GetNext())
					{
						SendLabelPacket(*l);
					}
					g_labelLock.Unlock();

					// Start CPU/GPU/Thermal sensors...
					StandardSensors stdsensors;
					if(CheckConnectionFlag(Enable_CPU_Clocks) || CheckConnectionFlag(Enable_GPU_Clocks) || CheckConnectionFlag(Enable_Thermal_Sensors))
					{
						stdsensors.Start();
					}

					// Spin as long as we are connected flushing data from our data stream...
					while(!QuitSignaled())
					{
						const UInt64 flushBeginTime = GetNanoseconds();
						const UInt32 waitflags = m_streamSocket->WaitFor(Socket::WaitFlag_Read | Socket::WaitFlag_Write | Socket::WaitFlag_Timeout, 2);
						if(waitflags & Socket::WaitFlag_Timeout)
						{
							// Connection likely failed somehow...
							break;
						}
						if(waitflags & Socket::WaitFlag_Read)
						{
							PacketHeader header;
							VarSetPacket packet;
							m_streamSocket->Receive((char*)&header, sizeof(header));
							if (header.packetID == Packet_Var_Set)
							{
								m_streamSocket->Receive((char*)&packet, sizeof(packet));
								g_varStore.Set(packet.labelID, packet.value, true);
							}
							else
							{
								Logf(Log_Warning, "OVR::Capture::RemoteServer; Received Invalid Capture Packet");
							}
						}
						if(waitflags & Socket::WaitFlag_Write)
						{
							// Socket is ready to write data... so now is a good time to flush pending capture data.
							SocketOutStream outStream(*m_streamSocket);
							if(!AsyncStream::FlushAll(outStream))
							{
								// Error occured... shutdown the connection.
								break;
							}
						}
						const UInt64 flushEndTime   = GetNanoseconds();
						const UInt64 flushDeltaTime = flushEndTime - flushBeginTime;
						const UInt64 sleepTime      = 4000000; // 4ms
						if(flushDeltaTime < sleepTime)
						{
							// Sleep just a bit to keep the thread from killing a core and to let a good chunk of data build up
							ThreadSleepNanoseconds((UInt32)(sleepTime - flushDeltaTime));
						}
					}

					// Clear the connection flags...
					AtomicExchange(g_connectionFlags, (UInt32)0);

					// Close down our sensor thread...
					stdsensors.QuitAndWait();

					// Connection was closed at some point, lets clean up our socket...
					m_streamSocket->Shutdown();
					m_streamSocket->Release();
					m_streamSocket = NULL;

					if(g_onDisconnect)
					{
						// After the connection is fully shut down, notify the app.
						g_onDisconnect();
					}

					// Clear the buffers for all AsyncStreams to guarantee that no event is 
					// stalled waiting for room on a buffer. Then we wait until there there
					// are no events still writing out.
					AsyncStream::ClearAll();
					while(AtomicGet(g_refcount) > 0)
					{
						ThreadSleepMilliseconds(1);
					}

					// Finally, release any AsyncStreams that were created during this session
					// now that we can safely assume there are no events actively trying to
					// write out to a stream.
					AsyncStream::Shutdown();

					g_varStore.Clear();
				} // while(m_listenSocket && !QuitSignaled())
			}