void S9xMSU1PostLoadState(void) { if (DataOpen()) { REVERT_STREAM(dataStream, MSU1.MSU1_DATA_POS, 0); } if (MSU1.MSU1_STATUS & AudioPlaying) { if (AudioOpen()) { REVERT_STREAM(audioStream, 4, 0); READ_STREAM((char *)&audioLoopPos, 4, audioStream); audioLoopPos = GET_LE32(&audioLoopPos); audioLoopPos <<= 2; audioLoopPos += 8; REVERT_STREAM(audioStream, MSU1.MSU1_AUDIO_POS, 0); } else { MSU1.MSU1_STATUS &= ~(AudioPlaying | AudioRepeating); MSU1.MSU1_STATUS |= AudioError; } } bufPos = 0; bufBegin = 0; bufEnd = 0; partial_frames = 0; }
static bool AudioOpen() { MSU1.MSU1_STATUS |= AudioError; AudioClose(); char ext[_MAX_EXT]; snprintf(ext, _MAX_EXT, "-%d.pcm", MSU1.MSU1_CURRENT_TRACK); audioStream = S9xMSU1OpenFile(ext); if (audioStream) { if (GETC_STREAM(audioStream) != 'M') return false; if (GETC_STREAM(audioStream) != 'S') return false; if (GETC_STREAM(audioStream) != 'U') return false; if (GETC_STREAM(audioStream) != '1') return false; READ_STREAM((char *)&audioLoopPos, 4, audioStream); audioLoopPos = GET_LE32(&audioLoopPos); audioLoopPos <<= 2; audioLoopPos += 8; MSU1.MSU1_AUDIO_POS = 8; MSU1.MSU1_STATUS &= ~AudioError; return true; } return false; }
void S9xMSU1PostLoadState(void) { if (DataOpen()) { REVERT_STREAM(dataStream, MSU1.MSU1_DATA_POS, 0); } if (MSU1.MSU1_STATUS & AudioPlaying) { uint32 savedPosition = MSU1.MSU1_AUDIO_POS; if (AudioOpen()) { REVERT_STREAM(audioStream, 4, 0); READ_STREAM((char *)&audioLoopPos, 4, audioStream); audioLoopPos = GET_LE32(&audioLoopPos); audioLoopPos <<= 2; audioLoopPos += 8; MSU1.MSU1_AUDIO_POS = savedPosition; REVERT_STREAM(audioStream, MSU1.MSU1_AUDIO_POS, 0); } else { MSU1.MSU1_STATUS &= ~(AudioPlaying | AudioRepeating); MSU1.MSU1_STATUS |= AudioError; } } if (msu_resampler) msu_resampler->clear(); partial_frames = 0; }
void GameClient::HandleRequestAccountData (CMSG_REQUEST_ACCOUNT_DATA_t &inpkt) { if (!Character) return; uint8 *data; if (inpkt.FileIndex <= 2) data = AccountData [inpkt.FileIndex]; else if (inpkt.FileIndex <= 4) data = Character->AccountData [inpkt.FileIndex - 3]; else return; if (!data) return; SMSG_UPDATE_ACCOUNT_DATA_t *outpkt = SMSG_UPDATE_ACCOUNT_DATA_t::Create (); outpkt->FileIndex = inpkt.FileIndex; outpkt->UncompressedSize = GET_LE32 (data); outpkt->CompressedData_Size = GET_LE32 (data + 4); outpkt->CompressedData = data + 24; Send (outpkt); }
static void nwsign(char *r_data1, char *r_data2, char *outdata) { int i; unsigned int w0,w1,w2,w3; static int rbit[4]={0, 2, 1, 3}; #ifdef __i386__ unsigned int *data2=(int *)r_data2; #else unsigned int data2[16]; for (i=0;i<16;i++) data2[i]=GET_LE32(r_data2+(i<<2)); #endif w0=GET_LE32(r_data1); w1=GET_LE32(r_data1+4); w2=GET_LE32(r_data1+8); w3=GET_LE32(r_data1+12); for (i=0;i<16;i+=4) { w0=rol32(w0 + ((w1 & w2) | ((~w1) & w3)) + data2[i+0],3); w3=rol32(w3 + ((w0 & w1) | ((~w0) & w2)) + data2[i+1],7); w2=rol32(w2 + ((w3 & w0) | ((~w3) & w1)) + data2[i+2],11); w1=rol32(w1 + ((w2 & w3) | ((~w2) & w0)) + data2[i+3],19); } for (i=0;i<4;i++) { w0=rol32(w0 + (((w2 | w3) & w1) | (w2 & w3)) + 0x5a827999 + data2[i+0],3); w3=rol32(w3 + (((w1 | w2) & w0) | (w1 & w2)) + 0x5a827999 + data2[i+4],5); w2=rol32(w2 + (((w0 | w1) & w3) | (w0 & w1)) + 0x5a827999 + data2[i+8],9); w1=rol32(w1 + (((w3 | w0) & w2) | (w3 & w0)) + 0x5a827999 + data2[i+12],13); } for (i=0;i<4;i++) { w0=rol32(w0 + ((w1 ^ w2) ^ w3) + 0x6ed9eba1 + data2[rbit[i]+0],3); w3=rol32(w3 + ((w0 ^ w1) ^ w2) + 0x6ed9eba1 + data2[rbit[i]+8],9); w2=rol32(w2 + ((w3 ^ w0) ^ w1) + 0x6ed9eba1 + data2[rbit[i]+4],11); w1=rol32(w1 + ((w2 ^ w3) ^ w0) + 0x6ed9eba1 + data2[rbit[i]+12],15); } PUT_LE32(outdata,(w0+GET_LE32(r_data1)) & 0xffffffff); PUT_LE32(outdata+4,(w1+GET_LE32(r_data1+4)) & 0xffffffff); PUT_LE32(outdata+8,(w2+GET_LE32(r_data1+8)) & 0xffffffff); PUT_LE32(outdata+12,(w3+GET_LE32(r_data1+12)) & 0xffffffff); }
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); }