示例#1
0
/*
    alcOpenDevice

    Open the Device specified.
*/
ALCAPI ALCdevice* ALCAPIENTRY alcOpenDevice(const ALCchar *deviceName)
{
    ALboolean bDeviceFound = AL_FALSE;
    ALCdevice *device;
    ALint i;

    if(deviceName && !deviceName[0])
        deviceName = NULL;

    device = malloc(sizeof(ALCdevice));
    if (device)
    {
        const char *fmt;

        //Initialise device structure
        memset(device, 0, sizeof(ALCdevice));

        //Validate device
        device->Connected = ALC_TRUE;
        device->IsCaptureDevice = AL_FALSE;

        device->Bs2b = NULL;
        device->szDeviceName = NULL;

        device->Contexts = NULL;
        device->NumContexts = 0;

        //Set output format
        device->Frequency = GetConfigValueInt(NULL, "frequency", SWMIXER_OUTPUT_RATE);
        if(device->Frequency == 0)
            device->Frequency = SWMIXER_OUTPUT_RATE;

        fmt = GetConfigValue(NULL, "format", "AL_FORMAT_STEREO16");
        device->Format = GetFormatFromString(fmt);

        device->NumUpdates = GetConfigValueInt(NULL, "periods", 4);
        if(device->NumUpdates < 2)
            device->NumUpdates = 4;

        i = GetConfigValueInt(NULL, "refresh", 4096);
        if(i <= 0) i = 4096;

        device->UpdateSize = GetConfigValueInt(NULL, "period_size", i/device->NumUpdates);
        if(device->UpdateSize <= 0)
            device->UpdateSize = i/device->NumUpdates;

        device->MaxNoOfSources = GetConfigValueInt(NULL, "sources", 256);
        if((ALint)device->MaxNoOfSources <= 0)
            device->MaxNoOfSources = 256;

        device->AuxiliaryEffectSlotMax = GetConfigValueInt(NULL, "slots", 4);
        if((ALint)device->AuxiliaryEffectSlotMax <= 0)
            device->AuxiliaryEffectSlotMax = 4;

        device->lNumStereoSources = 1;
        device->lNumMonoSources = device->MaxNoOfSources - device->lNumStereoSources;

        device->NumAuxSends = GetConfigValueInt(NULL, "sends", MAX_SENDS);
        if(device->NumAuxSends > MAX_SENDS)
            device->NumAuxSends = MAX_SENDS;

        device->Bs2bLevel = GetConfigValueInt(NULL, "cf_level", 0);

        // Find a playback device to open
        SuspendContext(NULL);
        for(i = 0;BackendList[i].Init;i++)
        {
            device->Funcs = &BackendList[i].Funcs;
            if(ALCdevice_OpenPlayback(device, deviceName))
            {
                device->next = g_pDeviceList;
                g_pDeviceList = device;
                g_ulDeviceCount++;

                bDeviceFound = AL_TRUE;
                break;
            }
        }
        ProcessContext(NULL);

        if (!bDeviceFound)
        {
            // No suitable output device found
            alcSetError(ALC_INVALID_VALUE);
            free(device);
            device = NULL;
        }
    }
    else
        alcSetError(ALC_OUT_OF_MEMORY);

    return device;
}
示例#2
0
int main(int argc, char* argv[])
{
	int result = 0;

	const char* pszSourceFilename = NULL;
	const char* pszDestFilename = NULL;
	bool bMultiFileMode = false;
	bool bPauseAtEnd = false;
	bool bPauseOnError = false;
	bool bRunTest = false;
	bool bClothingOptionSet = false;
	bool bCharacterOptionSet = false;

	if (argc == 1)
	{
		Usage();
		result = -1;
		goto Finish;
	}
	
	int iArg;
	for (iArg = 1; iArg < argc; ++iArg)
	{
		if ('-' == argv[iArg][0] || '/' == argv[iArg][0])
		{
			switch (argv[iArg][1])
			{
			case '?':
				Usage();
				result = 0;
				goto Finish;
				break;
			case 'a':
			case 'A':
			{
				int threshold = atoi(&argv[iArg][2]);
				if (threshold < 0 || threshold > 255)
				{
					printf("ERROR: Alpha threshold must be between 0 and 255.\n");
					result = -1;
					goto Finish;
				}
				MemImage::s_byAlphaThreshold = threshold;
				break;
			}
			case 'c':
			case 'C':
				MemImage::s_bCreateMipTestImage = true;
				break;
			case 'e':
			case 'E':
				bPauseOnError = true;
				break;
			case 'f':
			case 'F':
			{
				const char* arg = &argv[iArg][2];
				g_targetFormatID = FORMAT_UNSPECIFIED;

				g_targetFormatID = GetFormatFromString(arg);
				if (FORMAT_UNSPECIFIED == g_targetFormatID)
				{
					ListFormats();
					result = -1;
					goto Finish;
				}

				break;
			}
			/*
			case 'g':
			case 'G':
				MemImage::s_fGammaFactor = (float) atof(&argv[iArg][2]);
				if (MemImage::s_fGammaFactor < 0.0f || MemImage::s_fGammaFactor > 1.0f)
				{
					printf("ERROR: Gamma factor must between 0.0 and 1.0.\n");
					result = -1;
					goto Finish;
				}
				break;
			*/
			case 'h':
			case 'H':
				bCharacterOptionSet = true;
				MemImage::s_ruleTable[PNGTYPE_PALETTIZED_ALPHAMASK] = BLPTYPE_PAL_ALPHA0;
				MemImage::s_ruleTable[PNGTYPE_RGB] = BLPTYPE_PAL_ALPHA0;
				MemImage::s_ruleTable[PNGTYPE_RGBA] = BLPTYPE_PAL_ALPHA0;
				break;
			case 'i':
			case 'I':
				printf("File Info Mode.\n");
				g_bInfoMode = true;
				MemImage::s_bVerbose = true;
				bMultiFileMode = true;
				break;
			case 'l':
			case 'L':
				ListFormats();
				goto Finish;
				break;
			case 'm':
			case 'M':
				bMultiFileMode = true;
				break;
			case 'n':
			case 'N':
				MemImage::s_bNoMips = true;
				break;
			case 'p':
			case 'P':
				bPauseAtEnd = true;
				break;
			case 'r':
			case 'R':
				bClothingOptionSet = true;
				MemImage::s_ruleTable[PNGTYPE_RGB] = BLPTYPE_PAL_ALPHA0;
				MemImage::s_ruleTable[PNGTYPE_RGBA] = BLPTYPE_PAL_ALPHA8;
				MemImage::s_ruleTable[BLPTYPE_PAL_ALPHA0] = PNGTYPE_RGB;
				MemImage::s_ruleTable[BLPTYPE_PAL_ALPHA1] = PNGTYPE_RGBA;
				MemImage::s_ruleTable[BLPTYPE_PAL_ALPHA4] = PNGTYPE_RGBA;
				MemImage::s_ruleTable[BLPTYPE_PAL_ALPHA8] = PNGTYPE_RGBA;
				break;
			case 't':
			case 'T':
				bRunTest = true;
				break;
			case 'u':
			case 'U':
			{
				char arg[128];
				::strncpy(arg, &argv[iArg][2], 127);
				char* pszGT = ::strchr(arg, '=');
				if (NULL == pszGT)
				{
					LOG("ERROR: No \"=\" character found in /U option.\n");
					result = -1;
					goto Finish;
				}
				pszGT[0] = 0;
				char* arg2 = &pszGT[1];
				FORMATID srcID = GetFormatFromString(arg);
				FORMATID destID = GetFormatFromString(arg2);

				if (FORMAT_UNSPECIFIED == srcID || FORMAT_UNSPECIFIED == destID)
				{
					ListFormats();
					result = -1;
					goto Finish;
				}
				
				MemImage::s_ruleTable[srcID] = destID;
				break;
			}
			case 'v':
			case 'V':
				MemImage::s_bVerbose = true;
				break;
			default:
				printf("ERROR; %c is not a valid option.\n", argv[iArg][1]);
				result = -1;
				goto Finish;
			}
		}
		else
		{
			break;
		}
	}

	if (bRunTest)
	{
		if (!RunTest())
			result = -1;
		goto Finish;
	}

	if (bClothingOptionSet && bCharacterOptionSet)
	{
		printf("ERROR: -r and -h are exclusive.\n");
		result = -1;
		goto Finish;
	}

	if (iArg == argc)
	{
		printf("ERROR: Filename argument missing.\n");
		result = -1;
		goto Finish;
	}
	else if (bMultiFileMode)
	{
		do
		{
#ifndef LINUX
			char filepath[BLPCONV_MAX_PATH] = "";
			::strcpy(filepath, argv[iArg]);
			char* slash = ::strrchr(filepath, '\\');
			if (NULL == slash)
				slash = ::strrchr(filepath, '/');
			if (NULL != slash)
				slash[1] = 0;
			else
				filepath[0] = 0;

			//LOG("File to search for = %s.\n", argv[iArg]);

			WIN32_FIND_DATA aFindData;
			HANDLE hFindFile = ::FindFirstFile(argv[iArg], &aFindData);
			if (INVALID_HANDLE_VALUE == hFindFile)
			{
				printf("ERROR: Couldn't find file '%s'.\n", argv[iArg]);
				result = -1;
				break;
			}

			do
			{
				char foundFile[BLPCONV_MAX_PATH];
				::sprintf(foundFile, "%s%s", filepath, aFindData.cFileName);
				//LOG("FindFirstFile found %s\n", foundFile);

				result = ProcessFile(foundFile, NULL);
				if (result != 0)
					break;
			}
			while (FindNextFile(hFindFile, &aFindData));

			FindClose(hFindFile);
#else 
			DIR *dp; 
			struct dirent *de; 

			dp = opendir( dirname( argv[iArg] )); 
			if( dp == NULL ) { 
			    printf("ERROR: Couldn't find file '%s' (%d).\n", argv[iArg], errno);
			    result = -1; 
			} else { 

			while ( (de = readdir(dp)) != NULL ) {
			    if( fnmatch( basename(argv[iArg]), de->d_name, FNM_PATHNAME ) == 0 ) { 
				result = ProcessFile(de->d_name, NULL);
				if( result != 0 ) { 
				    break; 
				}
			    }
			}
			closedir(dp); 

			}
#endif

			++iArg;
		}
		while ((result == 0) && (iArg < argc));
	}
	else
	{
		pszSourceFilename = argv[iArg++];
		if (!bMultiFileMode && iArg < argc)
		{
			pszDestFilename = argv[iArg];
		}

		result = ProcessFile(pszSourceFilename, pszDestFilename);
	}

Finish:
	if (bPauseAtEnd || (bPauseOnError && result != 0))
	{
		printf("Press any key to continue...\n");
#ifndef LINUX
		_getch();
#else
		getchar(); 
#endif
	}

	return result;
}