예제 #1
0
bool Output::SwitchAudio(Track *track)
{
	ScopedLock a_lock(audioMutex);
	if (audioTrack && track->stream == audioTrack->stream)
		return true;
	if (audiofd > -1) {
		dioctl(audiofd, AUDIO_STOP, NULL);
		ioctl(audiofd, AUDIO_CLEAR_BUFFER, NULL);
	}
	audioTrack = track;
	if (track->stream) {
        AVCodecContext *avcc = track->stream->codec;
		if (!avcc)
			return false;
			audioWriter = Writer::GetWriter(avcc->codec_id, avcc->codec_type, audioTrack->ac3flags);
			audioWriter->Init(audiofd, audioTrack->stream, player);
		if (audiofd > -1) {
			audio_encoding_t audioEncoding = AUDIO_ENCODING_LPCMA;
		if (audioTrack->ac3flags != 6)
			audioEncoding = Writer::GetAudioEncoding(avcc->codec_id);
			dioctl(audiofd, AUDIO_SET_ENCODING, audioEncoding);
			dioctl(audiofd, AUDIO_PLAY, NULL);
		}
	}
	return true;
}
예제 #2
0
bool Output::Stop()
{
	bool ret = true;

	ScopedLock v_lock(videoMutex);
	ScopedLock a_lock(audioMutex);

	if (videofd > -1) {
		ioctl(videofd, VIDEO_CLEAR_BUFFER, NULL);
		/* set back to normal speed (end trickmodes) */
		dioctl(videofd, VIDEO_SET_SPEED, DVB_SPEED_NORMAL_PLAY);
		if (dioctl(videofd, VIDEO_STOP, NULL))
			ret = false;
	}

	if (audiofd > -1) {
		ioctl(audiofd, AUDIO_CLEAR_BUFFER, NULL);
		/* set back to normal speed (end trickmodes) */
		dioctl(audiofd, AUDIO_SET_SPEED, DVB_SPEED_NORMAL_PLAY);
		if (dioctl(audiofd, AUDIO_STOP, NULL))
			ret = false;
	}

	return ret;
}
예제 #3
0
bool Output::Open()
{
	ScopedLock v_lock(videoMutex);
	ScopedLock a_lock(audioMutex);

	if (videofd < 0)
		videofd = open(VIDEODEV, O_RDWR);

	if (videofd < 0)
		return false;

	ioctl(videofd, VIDEO_CLEAR_BUFFER, NULL);
	dioctl(videofd, VIDEO_SELECT_SOURCE, (void *) VIDEO_SOURCE_MEMORY);
	dioctl(videofd, VIDEO_SET_STREAMTYPE, (void *) STREAM_TYPE_PROGRAM);
	dioctl(videofd, VIDEO_SET_SPEED, DVB_SPEED_NORMAL_PLAY);

	if (audiofd < 0)
		audiofd = open(AUDIODEV, O_RDWR);

	if (audiofd < 0) {
		close(videofd);
		videofd = -1;
		return false;
	}

	ioctl(audiofd, AUDIO_CLEAR_BUFFER, NULL);
	dioctl(audiofd, AUDIO_SELECT_SOURCE, (void *) AUDIO_SOURCE_MEMORY);
	dioctl(audiofd, AUDIO_SET_STREAMTYPE, (void *) STREAM_TYPE_PROGRAM);

	return true;
}
예제 #4
0
bool Output::Play()
{
	bool ret = true;

	ScopedLock v_lock(videoMutex);
	ScopedLock a_lock(audioMutex);

	AVCodecContext *avcc;

	if (videoTrack && videoTrack->stream && videofd > -1 && (avcc = videoTrack->stream->codec)) {
		videoWriter = Writer::GetWriter(avcc->codec_id, avcc->codec_type, videoTrack->ac3flags);
		videoWriter->Init(videofd, videoTrack->stream, player);
		if (dioctl(videofd, VIDEO_SET_ENCODING, videoWriter->GetVideoEncoding(avcc->codec_id))
		||  dioctl(videofd, VIDEO_PLAY, NULL))
			ret = false;
	}

	if (audioTrack && audioTrack->stream && audiofd > -1 && (avcc = audioTrack->stream->codec)) {
		audioWriter = Writer::GetWriter(avcc->codec_id, avcc->codec_type, audioTrack->ac3flags);
		audioWriter->Init(audiofd, audioTrack->stream, player);
		audio_encoding_t audioEncoding = AUDIO_ENCODING_LPCMA;
		if (audioTrack->ac3flags != 6)
			audioEncoding = audioWriter->GetAudioEncoding(avcc->codec_id);
		if (dioctl(audiofd, AUDIO_SET_ENCODING, audioEncoding)
		||  dioctl(audiofd, AUDIO_PLAY, NULL))
			ret = false;
	}
	return ret;
}
예제 #5
0
bool Log::Output(const char* format, ...)
{
	if ( !m_bfLogger.IsOpen() )
	{
		return false;
	}

	AutoLock a_lock(m_mLock);

	char buf[MAX_BUFFER_SIZE] = "";
	va_list arg_ptr;
	va_start(arg_ptr, format);
	vsnprintf(buf, sizeof(buf), format, arg_ptr);
	va_end(arg_ptr);

	std::string str_out = SimpleTime::Now().LLTimeStamp() + std::string("\x20\x20") + buf;
	m_bfLogger.Write(str_out);
	++m_llLineCount;

	// Maximum file ?
	if ( CheckFileMaximum(str_out) )
	{
		m_bfLogger.Write(str_out);

		OpenNewLogger();
	}

	return true;
}
예제 #6
0
파일: output.cpp 프로젝트: Audioniek/apps
bool Output::SwitchAudio(AVStream *stream)
{
	ScopedLock a_lock(audioMutex);
	if (stream == audioStream)
	{
		return true;
	}
	if (audiofd > -1)
	{
		dioctl(audiofd, AUDIO_STOP, NULL);
		ioctl(audiofd, AUDIO_CLEAR_BUFFER, NULL);
	}
	audioStream = stream;
	if (stream)
	{
		AVCodecContext *avcc = stream->codec;
		if (!avcc)
		{
			return false;
		}
		audioWriter = Writer::GetWriter(avcc->codec_id, avcc->codec_type);
		audioWriter->Init(audiofd, audioStream, player);
		if (audiofd > -1)
		{
			dioctl(audiofd, AUDIO_SET_ENCODING, Writer::GetAudioEncoding(avcc->codec_id));
			dioctl(audiofd, AUDIO_PLAY, NULL);
		}
	}
	return true;
}
예제 #7
0
파일: output.cpp 프로젝트: Audioniek/apps
bool Output::Flush()
{
	bool ret = true;

	ScopedLock v_lock(videoMutex);
	ScopedLock a_lock(audioMutex);

	if (videofd > -1 && ioctl(videofd, VIDEO_FLUSH, NULL))
	{
		ret = false;
	}
	if (audiofd > -1 && audioWriter)
	{
		// flush audio decoder
		AVPacket packet;
		packet.data = NULL;
		packet.size = 0;
		audioWriter->Write(&packet, 0);

		if (ioctl(audiofd, AUDIO_FLUSH, NULL))
		{
			ret = false;
		}
	}
	return ret;
}
예제 #8
0
파일: output.cpp 프로젝트: Audioniek/apps
bool Output::Play()
{
	bool ret = true;

	ScopedLock v_lock(videoMutex);
	ScopedLock a_lock(audioMutex);

	AVCodecContext *avcc;

	if (videoStream && videofd > -1 && (avcc = videoStream->codec))
	{
		videoWriter = Writer::GetWriter(avcc->codec_id, avcc->codec_type);
		videoWriter->Init(videofd, videoStream, player);
		if (dioctl(videofd, VIDEO_SET_ENCODING, videoWriter->GetVideoEncoding(avcc->codec_id))
		||  dioctl(videofd, VIDEO_PLAY, NULL))
		{
			ret = false;
		}
	}

	if (audioStream && audiofd > -1 && (avcc = audioStream->codec))
	{
		audioWriter = Writer::GetWriter(avcc->codec_id, avcc->codec_type);
		audioWriter->Init(audiofd, audioStream, player);
		if (dioctl(audiofd, AUDIO_SET_ENCODING, audioWriter->GetAudioEncoding(avcc->codec_id))
		||  dioctl(audiofd, AUDIO_PLAY, NULL))
		{
			ret = false;
		}
	}
	return ret;
}
예제 #9
0
void Log::Notify()
{
	AutoLock a_lock(m_mLock);

	m_bfLogger.Write("\n\n\x20\x20\x20\x20( INTERVAL TIME END )");

	OpenNewLogger();
}
예제 #10
0
void Log::Init(const LogStrategy& strategy)
{
	AutoLock a_lock(m_mLock);

	ImportStrategy(strategy);

	StartTimer();

	OpenNewLogger();
}
예제 #11
0
bool Output::Write(AVStream *stream, AVPacket *packet, int64_t pts)
{
	switch (stream->codec->codec_type) {
		case AVMEDIA_TYPE_VIDEO: {
			ScopedLock v_lock(videoMutex);
			return videofd > -1 && videoWriter && videoWriter->Write(packet, pts);
		}
		case AVMEDIA_TYPE_AUDIO: {
			ScopedLock a_lock(audioMutex);
			return audiofd > -1 && audioWriter && audioWriter->Write(packet, pts);
		}
		default:
			return false;
	}
}
예제 #12
0
bool Output::Continue()
{
	bool ret = true;

	ScopedLock v_lock(videoMutex);
	ScopedLock a_lock(audioMutex);

	if (videofd > -1 && dioctl(videofd, VIDEO_CONTINUE, NULL))
		ret = false;

	if (audiofd > -1 && dioctl(audiofd, AUDIO_CONTINUE, NULL))
		ret = false;

	return ret;
}
예제 #13
0
bool Output::Pause()
{
	bool ret = true;

	ScopedLock v_lock(videoMutex);
	ScopedLock a_lock(audioMutex);

	if (videofd > -1) {
		if (dioctl(videofd, VIDEO_FREEZE, NULL))
			ret = false;
	}

	if (audiofd > -1) {
		if (dioctl(audiofd, AUDIO_PAUSE, NULL))
			ret = false;
	}

	return ret;
}
예제 #14
0
bool Output::Close()
{
	Stop();

	ScopedLock v_lock(videoMutex);
	ScopedLock a_lock(audioMutex);

	if (videofd > -1) {
		close(videofd);
		videofd = -1;
	}
	if (audiofd > -1) {
		close(audiofd);
		audiofd = -1;
	}

	videoTrack = NULL;
	audioTrack = NULL;

	return true;
}
예제 #15
0
bool Output::Mute(bool b)
{
	ScopedLock a_lock(audioMutex);
	//AUDIO_SET_MUTE has no effect with new player
	return audiofd > -1 && !dioctl(audiofd, b ? AUDIO_STOP : AUDIO_PLAY, NULL);
}
예제 #16
0
bool Output::ClearAudio()
{
	ScopedLock a_lock(audioMutex);
	return audiofd > -1 && !ioctl(audiofd, AUDIO_CLEAR_BUFFER, NULL);
}
예제 #17
0
bool Output::AVSync(bool b)
{
	ScopedLock a_lock(audioMutex);
	return audiofd > -1 && !dioctl(audiofd, AUDIO_SET_AV_SYNC, b);
}