示例#1
0
// ____________________________________________________________________________________
// Convert a C string to a 4-char code.
// interpret hex literals such as "\x00".
// return number of characters parsed.
static int StrTo4CharCode(const char *str, FourCharCode *p4cc)
{
	char buf[4];
	const char *p = str;
	int i, x;
	for (i = 0; i < 4; ++i) {
		if (*p != '\\') {
			if ((buf[i] = *p++) == '\0') {
				// special-case for 'aac ': if we only got three characters, assume the last was a space
				if (i == 3) {
					--p;
					buf[i] = ' ';
					break;
				}
				goto fail;
			}
		} else {
			if (*++p != 'x') goto fail;
			if (sscanf(++p, "%02X", &x) != 1) goto fail;
			buf[i] = x;
			p += 2;
		}
	}
	*p4cc = CFSwapInt32BigToHost(*(UInt32 *)buf);
	return p - str;
fail:
	return 0;
}
void 	CFStrToNum (CFStringRef inStr, UInt32 &outNum)
{
	char str[5];
	CFStringGetCString (inStr, str, 5, kCFStringEncodingASCII);
	outNum = str[0] << 24 | str[1] << 16 | str[2] << 8 | str[3];
	outNum = CFSwapInt32BigToHost (outNum);
}
int BLGetVolumeFinderInfo(BLContextPtr context, const char * mountpoint, uint32_t * words) {
    int err, i;
    struct volinfobuf vinfo;
    struct attrlist alist;


    alist.bitmapcount = 5;
    alist.reserved = 0;
    alist.commonattr = ATTR_CMN_FNDRINFO;
    alist.volattr = ATTR_VOL_INFO;
    alist.dirattr = 0;
    alist.fileattr = 0;
    alist.forkattr = 0;
    
    err = getattrlist(mountpoint, &alist, &vinfo, sizeof(vinfo), 0);
    if(err) {
      contextprintf(context, kBLLogLevelError,  "Can't get volume information for %s\n", mountpoint );
      return 1;
    }

    /* Finder info words are just opaque and in big-endian format on disk
	for HFS+ */
    
    for(i=0; i<6; i++) {
        words[i] = CFSwapInt32BigToHost(vinfo.finderinfo[i]);
    }

    *(uint64_t *)&words[6] = CFSwapInt64BigToHost(
					(*(uint64_t *)&vinfo.finderinfo[6]));
    
    return 0;
}
示例#4
0
bool	CACFArray::Get4CC(UInt32 inIndex, UInt32& outValue) const
{
	bool theAnswer = false;
	
	CFTypeRef theValue = NULL;
	if(GetCFType(inIndex, theValue))
	{
		if((theValue != NULL) && (CFGetTypeID(theValue) == CFNumberGetTypeID()))
		{
			CFNumberGetValue(static_cast<CFNumberRef>(theValue), kCFNumberSInt32Type, &outValue);
			theAnswer = true;
		}
		else if((theValue != NULL) && (CFGetTypeID(theValue) == CFStringGetTypeID()))
		{
			CFStringRef theString = static_cast<CFStringRef>(theValue);
			if(CFStringGetLength(theString) == 4)
			{
				char theCString[5];
				CFStringGetCString(theString, theCString, 5, kCFStringEncodingASCII);
				outValue = CFSwapInt32BigToHost(*reinterpret_cast<UInt32*>(theCString));
			}
		}
	}
	
	return theAnswer;
}
示例#5
0
//Swap int32 to system endianness
int32_t swapBytes_i32(int32_t val, bql_file *blendfile)
{
    if(blendfile->endianness == CFByteOrderLittleEndian)
        return CFSwapInt32LittleToHost(val);
    else if(blendfile->endianness == CFByteOrderBigEndian)
        return CFSwapInt32BigToHost(val);
    else return val;
}
static void show(const AudioBufferList &abl, int framesToPrint, int wordSize, const char *label, const char *fmtstr=NULL)
{
	printf("%s %p (%d fr%s):\n", label ? label : "AudioBufferList", &abl, framesToPrint, fmtstr ? fmtstr : "");
	const AudioBuffer *buf = abl.mBuffers;
	for (UInt32 i = 0; i < abl.mNumberBuffers; ++i, ++buf) {
		printf("    [%2d] %5dbytes %dch @ %p", (int)i, (int)buf->mDataByteSize, (int)buf->mNumberChannels, buf->mData);
		if (framesToPrint && buf->mData != NULL) {
			printf(":");
			Byte *p = (Byte *)buf->mData;
			for (int j = framesToPrint * buf->mNumberChannels; --j >= 0; )
				switch (wordSize) {
				case 0:	// native float
					printf(" %6.3f", *(Float32 *)p);
					p += sizeof(Float32);
					break;
				// positive: big endian
				case 1:
				case -1:
					printf(" %02X", *p);
					p += 1;
					break;
				case 2:
					printf(" %04X", CFSwapInt16BigToHost(*(UInt16 *)p));
					p += 2;
					break;
				case 3:
					printf(" %06X", (p[0] << 16) | (p[1] << 8) | p[2]);
					p += 3;
					break;
				case 4:
					printf(" %08X", (unsigned int)CFSwapInt32BigToHost(*(UInt32 *)p));
					p += 4;
					break;
				case 10:
					printf(" %6.3f", CASwapFloat32BigToHost(*(Float32 *)p));
					p += sizeof(Float32);
					break;
				case -2:
					printf(" %04X", CFSwapInt16LittleToHost(*(UInt16 *)p));
					p += 2;
					break;
				case -3:
					printf(" %06X", (p[2] << 16) | (p[1] << 8) | p[0]);
					p += 3;
					break;
				case -4:
					printf(" %08X", (unsigned int)CFSwapInt32LittleToHost(*(UInt32 *)p));
					p += 4;
					break;
				case -10:
					printf(" %6.3f", CASwapFloat32LittleToHost(*(Float32 *)p));
					p += sizeof(Float32);
					break;
				}
		}
		printf("\n");
	}
}
示例#7
0
int dir_GetMacFileTypeAndCreator(char *filename, sqInt filenameSize, char *fType, char *fCreator) {
	/* Get the Macintosh type and creator of the given file. */
	/* Note: On other platforms, this is just a noop. */

    FSCatalogInfo catInfo;
	FInfo	finderInfo;
	char	fileNameBuffer[DOCUMENT_NAME_SIZE+1];
	int		bytes;
	
 	bytes = ioFilenamefromStringofLengthresolveAliasesRetry(fileNameBuffer,filename, filenameSize, true, true);
	if (bytes == 0) 
		return false;
    
    if (getFInfo(fileNameBuffer,&catInfo,kCFStringEncodingUTF8) != noErr)
        return false;
		
	memcpy(&finderInfo,&catInfo.finderInfo,16);
	*((int *) fType) = CFSwapInt32BigToHost(finderInfo.fdType);
	*((int *) fCreator) = CFSwapInt32BigToHost(finderInfo.fdCreator);

	return true;
}
//_____________________________________________________________________________
//
const UInt8 *	AUElement::RestoreState(const UInt8 *state)
{
	union FloatInt32 { UInt32 i; AudioUnitParameterValue f; };
	const UInt8 *p = state;
	UInt32 nparams = CFSwapInt32BigToHost(*(UInt32 *)p);
	p += sizeof(UInt32);
	
	for (UInt32 i = 0; i < nparams; ++i) {
		struct {
			AudioUnitParameterID		paramID;
			AudioUnitParameterValue		value;
		} entry;
		
		entry.paramID = CFSwapInt32BigToHost(*(UInt32 *)p);
		p += sizeof(UInt32);
		FloatInt32 temp;
		temp.i = CFSwapInt32BigToHost(*(UInt32 *)p);
		entry.value = temp.f;
		p += sizeof(AudioUnitParameterValue);
		
		SetParameter(entry.paramID, entry.value);
	}
	return p;
}
示例#9
0
uint32_t
CalcTableChecksum(const uint32_t *tableStart, uint32_t length, bool skipChecksumAdjust = false)
{
    uint32_t sum = 0L;
    const uint32_t *table = tableStart;
    const uint32_t *end = table+((length+3) & ~3) / sizeof(uint32_t);
    while (table < end) {
        if (skipChecksumAdjust && (table - tableStart) == 2) {
            table++;
        } else {
            sum += CFSwapInt32BigToHost(*table++);
        }
    }
    return sum;
}
示例#10
0
/*====================================
	Constructor
=====================================*/
PTFamilyView::PTFamilyView( LStream *inStream ) : PTPaintView( inStream )
{
		// our refCon field has the resource id of our family information
	ResIDT infoID = this->GetUserCon();
	mFamilyListH = (PaintFamilyListH) SUFileUtils::GetAppResource( resType_PaintFamilyInfo, infoID );
	::DetachResource( (Handle) mFamilyListH );

// rlaurb - 08/06/2011
// Explicitly convert the mFamilyListH resource handle to native endian.
	(**mFamilyListH).defaultPane = CFSwapInt32BigToHost((**mFamilyListH).defaultPane);
	(**mFamilyListH).numEntries  = CFSwapInt32BigToHost((**mFamilyListH).numEntries);
	for (SInt32 i = 0; i < (**mFamilyListH).numEntries; i++) {
		(**mFamilyListH).members[i].resourceType =		CFSwapInt32BigToHost((**mFamilyListH).members[i].resourceType);
		(**mFamilyListH).members[i].flags =				CFSwapInt32BigToHost((**mFamilyListH).members[i].flags);
		(**mFamilyListH).members[i].width =				CFSwapInt32BigToHost((**mFamilyListH).members[i].width);
		(**mFamilyListH).members[i].height =			CFSwapInt32BigToHost((**mFamilyListH).members[i].height);
		(**mFamilyListH).members[i].depth =				CFSwapInt32BigToHost((**mFamilyListH).members[i].depth);
		(**mFamilyListH).members[i].rowBytes =			CFSwapInt32BigToHost((**mFamilyListH).members[i].rowBytes);
		(**mFamilyListH).members[i].samplePaneID =		CFSwapInt32BigToHost((**mFamilyListH).members[i].samplePaneID);
		(**mFamilyListH).members[i].maskOffset =		CFSwapInt32BigToHost((**mFamilyListH).members[i].maskOffset);
		(**mFamilyListH).members[i].maskRowBytes =		CFSwapInt32BigToHost((**mFamilyListH).members[i].maskRowBytes);
		(**mFamilyListH).members[i].maskSamplePaneID =	CFSwapInt32BigToHost((**mFamilyListH).members[i].maskSamplePaneID);
	}
}
int
checkForHeader(int afd, int *nPoles, float sr)
{
	int magic[2], headersize=0;
	/* see if second 32 bytes are the lpc header magic number */
	if(read(afd, (char *) magic, sizeof(magic)) != sizeof(magic)) {
		die("dataset", "Can't read analysis file.");
		return -1;
	}
	else lseek(afd, 0, 0);	/* back to beginning */

#ifdef MAXMSP
	if (CFByteOrderGetCurrent() == CFByteOrderLittleEndian) {
		magic[0] = CFSwapInt32BigToHost(magic[0]);
		magic[1] = CFSwapInt32BigToHost(magic[1]);
	}
#endif

	if(magic[1] == LP_MAGIC) {	/* has header */
		if(read(afd, (char *) &analheader, sizeof(analheader))
				!= sizeof(analheader)) {
			die("dataset", "Can't read analysis file header.");
			return -1;
		}

#ifdef MAXMSP
		if (CFByteOrderGetCurrent() == CFByteOrderLittleEndian) {
			analheader.headersize = CFSwapInt32BigToHost(analheader.headersize);
			analheader.lpmagic = CFSwapInt32BigToHost(analheader.lpmagic);
			analheader.npoles = CFSwapInt32BigToHost(analheader.npoles);
			analheader.nvals = CFSwapInt32BigToHost(analheader.nvals);
		}
#endif

		rtcmix_advise("dataset", "This is a csound-type data file with header.");
		if(lseek(afd, analheader.headersize, 0) < 0) {
			die("dataset", "Bad lseek past header.");
			return -1;
		}
		if(*nPoles != 0 && *nPoles != analheader.npoles) {
			die("dataset", "LPC header indicates %d poles--check your numbers.", analheader.npoles);
			return -1;
		}
		else if (analheader.npoles > MAXPOLES) {
			die("dataset", "LPC header %d poles > MAXPOLES (%d)!",
					analheader.npoles, MAXPOLES);
			return -1;
		}
		else if(!*nPoles) /* if none previously specified */
			rtcmix_advise("dataset", "npoles set to %d", *nPoles=analheader.npoles);
		if(sr != 0.0 && sr != analheader.srate) {
			rtcmix_warn("dataset",
				 "Warning: LPC header SR (%.1f) != soundfile SR (%.1f)!", 
				 analheader.srate, sr);
		}
		/* for all future lseeks */
		headersize = analheader.headersize;	
	}
	else if(!*nPoles) {	/* no header and no poles specified */
		die("dataset", "You must specify the number of poles for this file!");
		return -1;
	}
	return headersize;
}
示例#12
0
void *ConvertWAVCFURL(CFURLRef theURL, size_t *sndSize, int *loopStart, int *loopEnd, short *sampleSize, unsigned int *rate, bool *stereo)
{
	PCMWavePtr	WAVERsrc = NULL;
	long		fSize = 0;
	CFReadStreamRef fRef = CFReadStreamCreateWithFile(kCFAllocatorDefault, theURL);
	CFReadStreamOpen(fRef);
	CFStreamStatus theStat = CFReadStreamGetStatus(fRef);
	while (theStat != kCFStreamStatusOpen && theStat != kCFStreamStatusError) {
		theStat = CFReadStreamGetStatus(fRef);
	}
	if (theStat == kCFStreamStatusError) {
		CFReadStreamClose(fRef);
		CFRelease(fRef);
		return NULL;
	}
	
	*stereo = false;
	
	if (fRef != NULL) {
		fSize = URLGetFileSize(theURL);
		if (!(WAVERsrc = (PCMWavePtr)malloc(fSize))) {
			CFReadStreamClose(fRef);
			CFRelease(fRef);
			return NULL;
		}
		
		if (CFReadStreamRead(fRef, (UInt8*)WAVERsrc, fSize) != fSize) {
			free(WAVERsrc);
			CFReadStreamClose(fRef);
			CFRelease(fRef);
			return NULL;
		}
		
		if (memcmp(WAVERsrc->ckid, "RIFF", 4) == 0) {
			WAVERsrc->cksize = longswap(WAVERsrc->cksize);
			
			if (memcmp(WAVERsrc->fccType, "WAVE", 4) == 0) {
				WAVERsrc->dwDataOffset = longswap(WAVERsrc->dwDataOffset);
				
				if (memcmp(WAVERsrc->fmtType, "fmt ", 4) == 0) {
					WAVERsrc->wFormatTag		= shrtswap(WAVERsrc->wFormatTag);
					WAVERsrc->nCannels			= shrtswap(WAVERsrc->nCannels);
					WAVERsrc->nSamplesPerSec	= longswap(WAVERsrc->nSamplesPerSec);
					WAVERsrc->nSamplesPerSec	= CFSwapInt32BigToHost(WAVERsrc->nSamplesPerSec) << 16; //FIXME: is this right for LE machines?
					WAVERsrc->nAvgBytesPerSec	= longswap(WAVERsrc->nAvgBytesPerSec);
					WAVERsrc->nBlockAlign		= shrtswap(WAVERsrc->nBlockAlign);
					WAVERsrc->wBitsPerSample	= shrtswap(WAVERsrc->wBitsPerSample);
					WAVERsrc->dataSize			= longswap(WAVERsrc->dataSize);
					
					*loopStart	= 0;
					*loopEnd 	= 0;
					*sampleSize = WAVERsrc->wBitsPerSample;
					*rate		= WAVERsrc->nSamplesPerSec;
					
					if (WAVERsrc->nCannels == 2)
						*stereo = true;
					else
						*stereo = false;
					
					if (WAVERsrc->wFormatTag != 1) {
						free(WAVERsrc);
						CFReadStreamClose(fRef);
						CFRelease(fRef);
						return NULL;
					}
				} else {
					free(WAVERsrc);
					CFReadStreamClose(fRef);
					CFRelease(fRef);
					return NULL;
				}
			} else {
				free(WAVERsrc);
				CFReadStreamClose(fRef);
				CFRelease(fRef);
				return NULL;
			}
		} else {
			free(WAVERsrc);
			CFReadStreamClose(fRef);
			CFRelease(fRef);
			return NULL;
		}
		CFReadStreamClose(fRef);
		CFRelease(fRef);
	}
	
	{
#if __BIG_ENDIAN__
		unsigned short *tt;
#endif
		
		*sndSize = WAVERsrc->dataSize;
		memmove(WAVERsrc, WAVERsrc->theData, *sndSize);
		WAVERsrc = realloc(WAVERsrc, *sndSize);
		
		switch (*sampleSize) {
			case 8:
				MADConvertInstrument((Byte*)WAVERsrc, *sndSize);
				break;
				
			case 16:
#if __BIG_ENDIAN__
				tt = (unsigned short*)WAVERsrc;
				dispatch_apply((*sndSize) / 2, dispatch_get_global_queue(0, 0), ^(size_t i) {
					tt[i] = shrtswap(tt[i]);
				});
#endif
				break;
		}