コード例 #1
0
ファイル: msu1.cpp プロジェクト: Juraldinio/SNES9x-Core
void S9xMSU1Generate(size_t sample_count)
{
	partial_frames += 4410 * (sample_count / 2);

	while ((bufPos < (bufEnd - 2)) && partial_frames >= 3204)
	{
		if (MSU1.MSU1_STATUS & AudioPlaying && audioStream)
		{
			int32 sample;
			int16* left = (int16*)&sample;
			int16* right = left + 1;

			int bytes_read = READ_STREAM((char *)&sample, 4, audioStream);
			if (bytes_read == 4)
			{
				*left = ((int32)(int16)GET_LE16(left) * MSU1.MSU1_VOLUME / 255);
				*right = ((int32)(int16)GET_LE16(right) * MSU1.MSU1_VOLUME / 255);


				*(bufPos++) = *left;
				*(bufPos++) = *right;
				MSU1.MSU1_AUDIO_POS += 4;
				partial_frames -= 3204;
			}
			else
			if (bytes_read >= 0)
			{
				if (MSU1.MSU1_STATUS & AudioRepeating)
				{
					MSU1.MSU1_AUDIO_POS = audioLoopPos;
					REVERT_STREAM(audioStream, MSU1.MSU1_AUDIO_POS, 0);
				}
				else
				{
					MSU1.MSU1_STATUS &= ~(AudioPlaying | AudioRepeating);
					REVERT_STREAM(audioStream, 8, 0);
				}
			}
			else
			{
				MSU1.MSU1_STATUS &= ~(AudioPlaying | AudioRepeating);
			}
		}
		else
		{
			MSU1.MSU1_STATUS &= ~(AudioPlaying | AudioRepeating);
			partial_frames -= 3204;
			*(bufPos++) = 0;
			*(bufPos++) = 0;
		}
	}
}
コード例 #2
0
static int
pack_printf(
        void (*putc)(char **pbs, char *be, char c),
        char **pbuf_start,
        char *buf_end,
        const char *fmt,
        const char *pack,
        uint8_t *msg,
        uint32_t msg_len)
{
    char buf[sizeof(long long)*8];
    char c, sign, *cp=buf;
    int32_t left_prec, right_prec, zero_fill, pad, pad_on_right,
        i, islong, islonglong;
    long long val = 0;
    int32_t res = 0, length = 0;

    while ((c = fmt_next_char(&fmt)) != '\0') {
        if (c == '%') {
            c = fmt_next_char(&fmt);
            left_prec = right_prec = pad_on_right = islong = islonglong = 0;
            if (c == '-') {
                c = fmt_next_char(&fmt);
                pad_on_right++;
            }
            if (c == '0') {
                zero_fill = 1;
                c = fmt_next_char(&fmt);
            } else {
                zero_fill = 0;
            }
            while (is_digit(c)) {
                left_prec = (left_prec * 10) + (c - '0');
                c = fmt_next_char(&fmt);
            }
            if (c == '.') {
                c = fmt_next_char(&fmt);
                zero_fill++;
                while (is_digit(c)) {
                    right_prec = (right_prec * 10) + (c - '0');
                    c = fmt_next_char(&fmt);
                }
            } else {
                right_prec = left_prec;
            }
            sign = '\0';
            if (c == 'l') {
                /* 'long' qualifier */
                c = fmt_next_char(&fmt);
                islong = 1;
                if (c == 'l') {
                    /* long long qualifier */
                    c = fmt_next_char(&fmt);
                    islonglong = 1;
                }
            }
            /* Fetch value [numeric descriptors only] */
            switch (c) {
            case 'p':
                islong = 1;
            case 'd':
            case 'D':
            case 'x':
            case 'X':
            case 'u':
            case 'U':
            case 'b':
            case 'B':
                switch (fmt_next_char(&pack)) {
                case 'b':
                    GET_8(val, msg, msg_len);
                    break;
                case 'h':
                    GET_LE16(val, msg, msg_len);
                    break;
                case 'i':
                case 'I':
                    GET_LE32(val, msg, msg_len);
                    break;
                case 'q':
                    GET_LE64(val, msg, msg_len);
                    break;
                default:
                    c = 0;
                    break;
                }
                if ((c == 'd') || (c == 'D')) {
                    if (val < 0) {
                        sign = '-';
                        val = -val;
                    }
                } else {
                    /* Mask to unsigned, sized quantity */
                    if (!islonglong) {
                        if (islong) {
                            val &= ((long long)1 << (sizeof(long) * 8)) - 1;
                        } else{
                            val &= ((long long)1 << (sizeof(int) * 8)) - 1;
                        }
                    }
                }
                break;
            default:
                break;
            }
            /* Process output */
            switch (c) {
            case 'p':  /* Pointer */
                (*putc)(pbuf_start, buf_end,'0');
                (*putc)(pbuf_start, buf_end,'x');
                zero_fill = 1;
                left_prec = sizeof(unsigned long)*2;
            case 'd':
            case 'D':
            case 'u':
            case 'U':
            case 'x':
            case 'X':
                switch (c) {
                case 'd':
                case 'D':
                case 'u':
                case 'U':
                    length = _cvt(val, buf, 10, "0123456789");
                    break;
                case 'p':
                case 'x':
                    length = _cvt(val, buf, 16, "0123456789abcdef");
                    break;
                case 'X':
                    length = _cvt(val, buf, 16, "0123456789ABCDEF");
                    break;
                }
                cp = buf;
                break;
            case 's':
            case 'S':
                cp = NULL; /* TODO string literals not supported yet */
                if (cp == NULL)  {
                    cp = "<null>";
                }
                length = 0;
                while (cp[length] != '\0') length++;
                break;
            case 'c':
            case 'C':
                switch (fmt_next_char(&pack)) {
                case 'b':
                    GET_8(c, msg, msg_len);
                    break;
                case 'h':
                    GET_LE16(c, msg, msg_len);
                    break;
                case 'i':
                case 'I':
                    GET_LE32(c, msg, msg_len);
                    break;
                case 'q':
                    GET_LE64(c, msg, msg_len);
                    break;
                default:
                    c = 0;
                    break;
                }
                (*putc)(pbuf_start, buf_end,c);
                res++;
                continue;
            case 'b':
            case 'B':
                length = left_prec;
                if (left_prec == 0) {
                    if (islonglong)
                        length = sizeof(long long)*8;
                    else if (islong)
                        length = sizeof(long)*8;
                    else
                        length = sizeof(uint32_t)*8;
                }
                for (i = 0;  i < length-1;  i++) {
                    buf[i] = ((val & ((long long)1<<i)) ? '1' : '.');
                }
                cp = buf;
                break;
            case '%':
                (*putc)(pbuf_start, buf_end,'%');
                break;
            default:
                (*putc)(pbuf_start, buf_end,'%');
                (*putc)(pbuf_start, buf_end,c);
                res += 2;
            }
            pad = left_prec - length;
            if (sign != '\0') {
                pad--;
            }
            if (zero_fill) {
                c = '0';
                if (sign != '\0') {
                    (*putc)(pbuf_start, buf_end,sign);
                    res++;
                    sign = '\0';
                }
            } else {
                c = ' ';
            }
            if (!pad_on_right) {
                while (pad-- > 0) {
                    (*putc)(pbuf_start, buf_end,c);
                    res++;
                }
            }
            if (sign != '\0') {
                (*putc)(pbuf_start, buf_end,sign);
                res++;
            }
            while (length-- > 0) {
                c = *cp++;
                (*putc)(pbuf_start, buf_end,c);
                res++;
            }
            if (pad_on_right) {
                while (pad-- > 0) {
                    (*putc)(pbuf_start, buf_end,' ');
                    res++;
                }
            }
        } else {
            (*putc)(pbuf_start, buf_end,c);
            res++;
        }
    }
    (*putc)(pbuf_start, buf_end, '\0');
msg_error:
    return (res);
}
コード例 #3
0
ファイル: lzmat_dec.c プロジェクト: Grumbel/rfactortools
int LZMAT_CALLCONV lzmat_decode(MP_U8 *pbOut, MP_U32 *pcbOut,
	MP_U8 *pbIn, MP_U32 cbIn)
{
	MP_U32  inPos, outPos;
	MP_U32  cbOutBuf = *pcbOut;
	MP_U8 cur_nib;
	*pbOut = *pbIn;
	for(inPos=1, outPos=1, cur_nib=0; inPos<(cbIn-cur_nib);)
	{
		int bc;
		MP_U8 tag;
		tag = LZMAT_GET_U8(pbIn+inPos,cur_nib);
		inPos++;
		for(bc=0; bc<8 && inPos<(cbIn-cur_nib) && outPos<cbOutBuf; bc++, tag<<=1)
		{
			if(tag&0x80) // gamma
			{
				MP_U32 r_pos, r_cnt, dist;
#define cflag	r_cnt
				cflag = LZMAT_GET_LE16(pbIn+inPos,cur_nib);
				inPos++;
				if(outPos>MAX_LZMAT_SHORT_DIST1)
				{
					dist = cflag>>2;
					switch(cflag&3)
					{
					case 0:
						dist=(dist&LZMAT_DIST_MSK0)+1;
						break;
					case 1:
						inPos+=cur_nib;
						dist = (dist&LZMAT_DIST_MSK1)+0x41;
						cur_nib^=1;
						break;
					case 2:
						inPos++;
						dist += 0x441;
						break;
					case 3:
						if((inPos+2+cur_nib)>cbIn)
							return LZMAT_STATUS_INTEGRITY_FAILURE+1;
						inPos++;
						dist = (dist + 
							((MP_U32)LZMAT_GET_U4(pbIn,inPos,cur_nib)<<14))
							+0x4441;
						break;
					}
				}
				else
				{
					dist = cflag>>1;
					if(cflag&1)
					{
						inPos+=cur_nib;
						dist = (dist&0x7FF)+0x81;
						cur_nib^=1;
					}
					else
						dist = (dist&0x7F)+1;
				}
#undef cflag
				r_cnt = LZMAT_GET_U4(pbIn,inPos,cur_nib);
				if(r_cnt!=0xF)
				{
					r_cnt += 3;
				}
				else
				{
					if((inPos+1+cur_nib)>cbIn)
						return LZMAT_STATUS_INTEGRITY_FAILURE+2;
					r_cnt = LZMAT_GET_U8(pbIn+inPos,cur_nib);
					inPos++;
					if(r_cnt!=0xFF)
					{
						r_cnt += LZMAT_DEFAULT_CNT;
					}
					else
					{
						if((inPos+2+cur_nib)>cbIn)
							return LZMAT_STATUS_INTEGRITY_FAILURE+3;
						r_cnt = LZMAT_GET_LE16(pbIn+inPos,cur_nib)+LZMAT_1BYTE_CNT;
						inPos+=2;
						if(r_cnt==LZMAT_2BYTE_CNT)
						{
							// copy chunk
							if(cur_nib)
							{
								r_cnt = ((MP_U32)pbIn[inPos-4]&0xFC)<<5;
								inPos++;
								cur_nib = 0;
							}
							else
							{
								r_cnt = (GET_LE16(pbIn+inPos-5)&0xFC0)<<1;
							}
							r_cnt+=(tag&0x7F)+4;
							r_cnt<<=1;
							if((outPos+(r_cnt<<2))>cbOutBuf)
								return LZMAT_STATUS_BUFFER_TOO_SMALL;
							while(r_cnt-- && outPos<cbOutBuf)
							{
								*(MP_U32 *)(pbOut+outPos)=*(MP_U32 *)(pbIn+inPos);
								inPos+=4;
								outPos+=4;
							}
							break;
						}
					}
				}
				if(outPos<dist)
					return LZMAT_STATUS_INTEGRITY_FAILURE+4;
				if((outPos+r_cnt)>cbOutBuf)
					return LZMAT_STATUS_BUFFER_TOO_SMALL+1;
				r_pos = outPos-dist;
				while(r_cnt-- && outPos<cbOutBuf)
					pbOut[outPos++]=pbOut[r_pos++];
			}