/*
 * Class:     sage_DShowDVDPlayer
 * Method:    setupGraph0
 * Signature: (JLjava/lang/String;Ljava/lang/String;ZZ)V
 */
JNIEXPORT void JNICALL Java_sage_DShowDVDPlayer_setupGraph0
	(JNIEnv *env, jobject jo, jlong dataPtr, jstring jFilename, jstring jhostname, 
		jboolean renderVideo, jboolean renderAudio)
{
	NPE_RET(dataPtr);
	try
	{
		CDVDPlayerData* playerData = dynamic_cast<CDVDPlayerData*>((CPlayerData*) dataPtr);
		const jchar* wszFilename = jFilename ? env->GetStringChars(jFilename, NULL) : NULL;
		HRESULT hr = playerData->SetDVDLocation((const WCHAR*) wszFilename);
		if (wszFilename)
			env->ReleaseStringChars(jFilename, wszFilename);
		PLAYEXCEPT_RET(sage_PlaybackException_FILESYSTEM);

		if (renderAudio)
		{
			hr = playerData->RenderAudio();
			PLAYEXCEPT_RET(sage_PlaybackException_AUDIO_RENDER);
		}
		if (renderVideo)
		{
			hr = playerData->RenderVideo();
			PLAYEXCEPT_RET(sage_PlaybackException_VIDEO_RENDER);
			hr = playerData->RenderSubPicture();
			HTESTPRINT(hr); // if there's no subpicture we're OK and shouldn't fail
			hr = playerData->RenderCC();
			HTESTPRINT(hr); // if there's no CC we're OK and shouldn't fail
		}
		LogFilterGraphInfo(playerData->GetGraph());
	}
	catch (...)
	{
		throwPlaybackException(env, sage_PlaybackException_DIRECTX_INSTALL, 0);
	}
}
Example #2
0
/*
 * Class:     sage_DShowMediaPlayer
 * Method:    setupGraph0
 * Signature: (JLjava/lang/String;Ljava/lang/String;ZZ)V
 */
JNIEXPORT void JNICALL Java_sage_DShowMediaPlayer_setupGraph0
	(JNIEnv *env, jobject jo, jlong dataPtr, jstring jFilename, jstring jhostname,
		jboolean renderVideo, jboolean renderAudio)
{
	NPE_RET(dataPtr);
	try
	{
		CPlayerData* playData = (CPlayerData*) dataPtr;
		const jchar* wszFilename = env->GetStringChars(jFilename, NULL);
		const char* cHostname = jhostname ? env->GetStringUTFChars(jhostname, NULL) : NULL;
		HRESULT hr = playData->SetSourceFilename((const WCHAR**) &wszFilename, 1, cHostname);
		env->ReleaseStringChars(jFilename, wszFilename);
		if (cHostname)
			env->ReleaseStringUTFChars(jhostname, cHostname);
		if (hr == E_NOINTERFACE)
		{
			// This happens if they're using the wrong SageTV filter components from an older version
			PLAYEXCEPT_RET(sage_PlaybackException_SAGETV_INSTALL);
		}
		PLAYEXCEPT_RET(sage_PlaybackException_FILESYSTEM);

		BOOL hasDemux = playData->HasDemux();
		if (hasDemux)
		{
			if (renderAudio)
				hr = playData->RenderAudio();
			PLAYEXCEPT_RET(sage_PlaybackException_AUDIO_RENDER);
			if (renderVideo)
				hr = playData->RenderVideo();
			PLAYEXCEPT_RET(sage_PlaybackException_VIDEO_RENDER);
			if (renderVideo)
				hr = playData->RenderCC(); // We accept failures rendering this
			//HTESTPRINT(hr);
		}
		else if (renderAudio || renderVideo)
		{
			hr = playData->RenderSource();
			PLAYEXCEPT_RET(renderVideo ? sage_PlaybackException_VIDEO_RENDER : sage_PlaybackException_AUDIO_RENDER);
		}
		LogFilterGraphInfo(playData->GetGraph());
	}
	catch (...)
	{
		throwPlaybackException(env, sage_PlaybackException_VIDEO_RENDER, 0);
	}
}
/*
 * Class:     sage_DShowDVDPlayer
 * Method:    processEvents0
 * Signature: (J)I
 */
JNIEXPORT jint JNICALL Java_sage_DShowDVDPlayer_processEvents0
  (JNIEnv *env, jobject jo, jlong dataPtr)
{
	if (!dataPtr) return JNI_TRUE;
	CDVDPlayerData* playerData = dynamic_cast<CDVDPlayerData*>((CPlayerData*) dataPtr);
	IDvdInfo2* pInfo = playerData->GetDVDInfo();
	IDvdControl2* pCtrl = playerData->GetDVDCtrl();
	if (!pCtrl || !pInfo) return JNI_TRUE;

	HRESULT hr = S_OK;
	// Clear out any events in the DVD event queue, this method is called with null params
	// when that's all we need to do
	CComPtr<IMediaEvent> pIME = NULL;
	hr = playerData->GetGraph()->QueryInterface(IID_IMediaEvent, (void**)&pIME);
    long lEvent, lParam1, lParam2;
    long lTimeOut = 0;
	long evErr = 0;
	static jclass stringClass = (jclass) env->NewGlobalRef(env->FindClass("java/lang/String"));
	LCID language;
	TCHAR langString[256];
	BOOL subPicDisabled;
	DVD_SubpictureAttributes dvdSubpic;
	ULONG ulTotal=0, ulCurr=0;

	jboolean rv = 0;
	ULONG numVols, currVol, numTitles=0;

	while (SUCCEEDED(pIME->GetEvent(&lEvent, (LONG_PTR *) &lParam1, 
                    (LONG_PTR *) &lParam2, lTimeOut)))
	{
        slog((env, "Event: %#x l1=0x%x l2=0x%x\r\n", lEvent, lParam1, lParam2));

		switch(lEvent)
        {
			case EC_DVD_PLAYBACK_STOPPED:
				slog((env, "EC_DVD_PLAYBACK_STOPPED event received reason=%d\n", (int)lParam1));
				rv = 1;
				break;
			case EC_COMPLETE:
				slog((env, "EC_COMPLETE event received\n"));
				rv = 1;
				break;
	        case EC_DVD_NO_FP_PGC:
				pCtrl->PlayTitle(1, DVD_CMD_FLAG_None, NULL);
				break;
			case EC_DVD_ANGLE_CHANGE:
				playerData->m_currAngle = lParam2;
				playerData->m_totalAngles = lParam1;
				break;
			case EC_DVD_CHAPTER_START:
				playerData->m_currChapter = lParam1;
				break;
			case EC_DVD_DOMAIN_CHANGE:
				playerData->m_currDomain = (DVD_DOMAIN)lParam1;
				DVD_DISC_SIDE currSide;
				pInfo->GetDVDVolumeInfo(&numVols, &currVol, &currSide, &numTitles);
				playerData->m_totalTitles = numTitles;
				// Audio & subpic selections can change on domain changes in DShow
				//break;
			case EC_DVD_TITLE_CHANGE:
				if (lEvent == EC_DVD_TITLE_CHANGE)
				{
					playerData->m_currTitle = lParam1;
					hr = pInfo->GetNumberOfChapters(lParam1, (ULONG*)&(playerData->m_totalChapters));
				}
				// Subtitles/audio selections change on title boundaries so reconfigure those values
				hr = pInfo->GetCurrentSubpicture(&ulTotal, &ulCurr, &subPicDisabled);
				if (SUCCEEDED(hr))
				{
					for( UINT j = 0; j < ulTotal; j++ )
					{
						hr = pInfo->GetSubpictureLanguage(j, &language);
						if (SUCCEEDED(hr))
						{
							sprintf(langString, "%d ", j + 1);
							GetLocaleInfo(language, LOCALE_SENGLANGUAGE, langString + strlen(langString), 256 - strlen(langString));
							pInfo->GetSubpictureAttributes(j, &dvdSubpic);
							if (SUCCEEDED(hr))
							{
								switch (dvdSubpic.LanguageExtension)
								{
									case DVD_SP_EXT_Caption_Normal:
										strcat(langString, " Normal");
										break;
									case DVD_SP_EXT_Caption_Big:
										strcat(langString, " Large");
										break;
									case DVD_SP_EXT_Caption_Children:
										strcat(langString, " Children");
										break;
									case DVD_SP_EXT_CC_Normal:
										strcat(langString, " Normal CC");
										break;
									case DVD_SP_EXT_CC_Big:
										strcat(langString, " Large CC");
										break;
									case DVD_SP_EXT_CC_Children:
										strcat(langString, " Children CC");
										break;
									case DVD_SP_EXT_Forced:
										strcat(langString, " Forced");
										break;
									case DVD_SP_EXT_DirectorComments_Normal:
										strcat(langString, " Director Comments");
										break;
									case DVD_SP_EXT_DirectorComments_Big:
										strcat(langString, " Large Director Comments");
										break;
									case DVD_SP_EXT_DirectorComments_Children:
										strcat(langString, " Director Comments for Children");
										break;
								}
							}
							strcpy(playerData->m_availSubs[j], langString);
						}
						else
							playerData->m_availSubs[j][0] = '\0';
					}
					playerData->m_numAvailSubs = ulTotal;
					playerData->m_currSub = subPicDisabled ? -1 : ulCurr;
				}
				hr = pInfo->GetCurrentAudio(&ulTotal, &ulCurr);
				DVD_AudioAttributes dvdAudio;
				if (SUCCEEDED(hr))
				{
					for( UINT j = 0; j < ulTotal; j++ )
					{
						hr = pInfo->GetAudioLanguage(j, &language);
						if (SUCCEEDED(hr))
						{
							sprintf(langString, "%d ", j + 1);
							GetLocaleInfo(language, LOCALE_SENGLANGUAGE, langString + strlen(langString), 256 - strlen(langString));
							pInfo->GetAudioAttributes(j, &dvdAudio);
							if (SUCCEEDED(hr))
							{
								switch (dvdAudio.AudioFormat)
								{
									case DVD_AudioFormat_AC3:
										strcat(langString, " AC3");
										break;
									case DVD_AudioFormat_DTS:
										strcat(langString, " DTS");
										break;
									case DVD_AudioFormat_SDDS:
										strcat(langString, " SDDS");
										break;
								}
								switch (dvdAudio.LanguageExtension)
								{
									case DVD_AUD_EXT_DirectorComments1:
										strcat(langString, " w/Comments");
										break;
									case DVD_AUD_EXT_DirectorComments2:
										strcat(langString, " w/Comments 2");
										break;
								}
								if (dvdAudio.bNumberOfChannels == 6)
								{
									strcat(langString, " 5.1");
								}
							}
							strcpy(playerData->m_availLangs[j], langString);
						}
						else
							playerData->m_availLangs[j][0] = '\0';
					}
					playerData->m_numAvailLangs = ulTotal;
					playerData->m_currLang = ulCurr;
				}
				break;
			case EC_DVD_BUTTON_CHANGE:
				playerData->m_numButtons = lParam1;
				break;
			case EC_DVD_AUDIO_STREAM_CHANGE:
				playerData->m_currLang = (lParam1 == 0xFFFFFFFF) ? -1 : lParam1;
				break;
			case EC_DVD_SUBPICTURE_STREAM_CHANGE:
				playerData->m_currSub = (lParam1 == 0xFFFFFFFF) ? -1 : lParam1;
				if (lParam2 == 0)
					playerData->m_currSub = -1; // disabled subpicture
				break;

	        case EC_DVD_ERROR:
		        slog((env, "DVD Event: Error event received (code %ld)\r\n", lParam1));
				hr = lParam1;
				pIME->FreeEventParams(lEvent, lParam1, lParam2);
				switch (hr)
				{
					case DVD_ERROR_Unexpected:
						throwPlaybackException(env, sage_PlaybackException_DVD_GENERAL, hr);/*"An unexpected error (possibly incorrectly authored content)\nwas encountered.\nCan't playback this DVD-Video disc."*/
						return rv;
					case DVD_ERROR_CopyProtectFail:
						throwPlaybackException(env, sage_PlaybackException_DVD_COPYPROTECT, hr);/*"Key exchange for DVD copy protection failed.\nCan't playback this DVD-Video disc."*/
						return rv;
					case DVD_ERROR_InvalidDVD1_0Disc:
						throwPlaybackException(env, sage_PlaybackException_DVD_GENERAL, hr);/*"This DVD-Video disc is incorrectly authored for v1.0  of the spec.\nCan't playback this disc."*/
						return rv;
					case DVD_ERROR_InvalidDiscRegion:
						throwPlaybackException(env, sage_PlaybackException_DVD_REGION, hr);/*"This DVD-Video disc cannot be played, because it is not\nauthored to play in the current system region.\nThe region mismatch may be fixed by changing the\nsystem region (with DVDRgn.exe)."*/
						return rv;
					case DVD_ERROR_LowParentalLevel:
						throwPlaybackException(env, sage_PlaybackException_DVD_GENERAL, hr);/*"Player parental level is set lower than the lowest parental\nlevel available in this DVD-Video content.\nCannot playback this DVD-Video disc."*/
						return rv;
					case DVD_ERROR_MacrovisionFail:
						throwPlaybackException(env, sage_PlaybackException_DVD_COPYPROTECT, hr);/*"This DVD-Video content is protected by Macrovision.\nThe system does not satisfy Macrovision requirement.\nCan't continue playing this disc."*/
						return rv;
					case DVD_ERROR_IncompatibleSystemAndDecoderRegions:
						throwPlaybackException(env, sage_PlaybackException_DVD_REGION, hr);/*"No DVD-Video disc can be played on this system, because \nthe system region does not match the decoder region.\nPlease contact the manufacturer of this system."*/
						return rv;
					case DVD_ERROR_IncompatibleDiscAndDecoderRegions:
						throwPlaybackException(env, sage_PlaybackException_DVD_REGION, hr);/*"This DVD-Video disc cannot be played on this system, because it is\nnot authored to be played in the installed decoder's region."*/
						return rv;
				}
				throwPlaybackException(env, sage_PlaybackException_DVD_GENERAL, hr);/*"An unknown error occurred while trying to playback the DVD"*/
				return rv;
            
        } // end of switch(lEvent)
		pIME->FreeEventParams(lEvent, lParam1, lParam2) ;
    } // end of while(GetEvent())
	return rv;
}