Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?
- // open a brstm in binary mode as $fp
- fseek($fp, 8, SEEK_SET);
- $rstmSize = hexdec(bin2hex(fread($fp, 4)));
- fseek($fp, 16, SEEK_SET); // Reading section offsets
- $rstmInfoOffset = hexdec(bin2hex(fread($fp, 4)));
- $rstmInfoSize = hexdec(bin2hex(fread($fp, 4)));
- $rstmSeekOffset = hexdec(bin2hex(fread($fp, 4)));
- $rstmSeekSize = hexdec(bin2hex(fread($fp, 4)));
- $rstmDataOffset = hexdec(bin2hex(fread($fp, 4)));
- $rstmDataSize = hexdec(bin2hex(fread($fp, 4))) - 0x20;
- fseek($fp, 0x60, SEEK_SET);
- $format = hexdec(bin2hex(fread($fp, 1)));
- $loopFlag = hexdec(bin2hex(fread($fp, 1)));
- $channelCount = hexdec(bin2hex(fread($fp, 1)));
- $nibbleCount = $rstmDataSize / $channelCount * 2;
- fseek($fp, 1, SEEK_CUR);
- $sampleRate = hexdec(bin2hex(fread($fp, 2)));
- fseek($fp, 2, SEEK_CUR);
- $loopStart = hexdec(bin2hex(fread($fp, 4)));
- $loopStartNibbles = floor(($loopStart * $channelCount * 8 / 14));
- $sampleCount = hexdec(bin2hex(fread($fp, 4)));
- //$loopEndNibbles = $nibbleCount - 1;
- $loopEndNibbles = floor(($sampleCount * $channelCount * 8 / 14) - 1);
- // fetching coefficients, initial state, and loop context
- fseek($fp, 0x5c, SEEK_SET);
- $coeffPtr1 = hexdec(bin2hex(fread($fp, 4)));
- fseek($fp, 0x50 + $coeffPtr1, SEEK_SET);
- $coeffPtr2 = hexdec(bin2hex(fread($fp, 4)));
- fseek($fp, 0x50 + $coeffPtr2, SEEK_SET);
- $coeffL = fread($fp, 0x30);
- if ($channelCount == 2) {
- fseek($fp, 8, SEEK_CUR);
- $coeffR = fread($fp, 0x30);
- }
- fseek($fp, 0x78, SEEK_SET);
- $interleave = hexdec(bin2hex(fread($fp, 4)));
- fseek($fp, 0x88, SEEK_SET);
- $interleaveShortBlock = hexdec(bin2hex(fread($fp, 4)));
- if ($downloadtype == "hps") {
- print(" HALPST" . pack("CNN", 0, $sampleRate, $channelCount));
- $firstBlockSize = $blockSize = 0x10000;
- // writing first channel
- print(pack("NNNN", $blockSize, $channelCount, $nibbleCount, 2) . substr($coeffL, 0, 0x28));
- if ($channelCount == 2)
- print(pack("NNNN", $blockSize, $channelCount, $nibbleCount, 2) . substr($coeffR, 0, 0x28));
- // Writing blocks
- if ($loopFlag) {
- $preLoopBlockCount = floor($loopStart/57344);
- if ($loopStart < 57344) {
- if ($loopStart)
- $preLoopBlockSize = $loopStart * 16/14 + 0x20;
- else
- $preLoopBlockSize = 0;
- $loopStartBlock = 0x80 + $preLoopBlockSize;
- }
- else if ($loopStart % 57344 == 0)
- $preLoopBlockSize = 0;
- else {
- $preLoopBlockSize = ($loopStart % 57344) * 16/14 + 0x20;
- }
- $loopStartBlock = 0x80 + $preLoopBlockCount * ($blockSize + 0x20) + $preLoopBlockSize;
- }
- else {
- $preLoopBlockCount = $preLoopBlockSize = 0;
- $loopStartBlock = 0xffffffff;
- }
- $blockCount = floor(($rstmDataSize - $loopStartNibbles - $interleaveShortBlock * 2) / 0x10000);
- $lastBlockSize = ($rstmDataSize - $loopStartNibbles) % 0x10000;
- $currentOffset = 0x80;
- header( 'Content-Length: ' . 0x80 + ($preLoopBlockCount + $blockCount) * ($blockSize + 0x20) + $preLoopBlockSize + 0x20 + $lastBlockSize + 0x20 );
- fseek($fp, $rstmDataOffset + 0x20, SEEK_SET);
- for ($i = 0; $i < $preLoopBlockCount; $i++) {
- print(pack("NNN", $blockSize, $blockSize-1, $currentOffset + $blockSize + 0x20) . substr($coeffL, 0x22, 6) . pack("n", 0) . substr($coeffR, 0x22, 6) . pack("nN", 0, 0));
- $currentOffset += $blockSize + 0x20;
- print(fread($fp, 0x2000));
- for ($j = 0; $j < ($blockSize / 0x4000 - 1); $j++) {
- fseek($fp, 0x2000, SEEK_CUR);
- print(fread($fp, 0x2000));
- }
- fseek($fp, -($j * 0x4000), SEEK_CUR);
- print(fread($fp, 0x2000));
- for ($j = 0; $j < ($blockSize / 0x4000 - 1); $j++) {
- fseek($fp, 0x2000, SEEK_CUR);
- print(fread($fp, 0x2000));
- }
- }
- // Printing block before loopStart
- if ($preLoopBlockSize) {
- print(pack("NNN", $preLoopBlockSize - 0x20, $preLoopBlockSize-0x21, $currentOffset + $preLoopBlockSize) . substr($coeffL, 0x22, 6) . pack("n", 0) . substr($coeffR, 0x22, 6) . pack("nN", 0, 0));
- $currentOffset += $preLoopBlockSize;
- print(fread($fp, 0x2000));
- for ($j = 0; $j < (($preLoopBlockSize-0x20) / 0x4000 - 1); $j++) {
- fseek($fp, 0x2000, SEEK_CUR);
- print(fread($fp, 0x2000));
- }
- fseek($fp, -($j * 0x4000), SEEK_CUR);
- print(fread($fp, 0x2000));
- for ($j = 0; $j < (($preLoopBlockSize-0x20) / 0x4000 - 1); $j++) {
- fseek($fp, 0x2000, SEEK_CUR);
- print(fread($fp, 0x2000));
- }
- }
- // Writing rest
- for ($i = 0; $i < $blockCount; $i++) {
- print(pack("NNN", $blockSize, $blockSize-1, $currentOffset + $blockSize + 0x20) . substr($coeffL, 0x22, 6) . pack("n", 0) . substr($coeffR, 0x22, 6) . pack("nN", 0, 0));
- $currentOffset += $blockSize + 0x20;
- print(fread($fp, 0x2000));
- fseek($fp, 0x2000, SEEK_CUR);
- print(fread($fp, 0x2000));
- fseek($fp, 0x2000, SEEK_CUR);
- print(fread($fp, 0x2000));
- fseek($fp, 0x2000, SEEK_CUR);
- print(fread($fp, 0x2000));
- fseek($fp, -0xc000, SEEK_CUR);
- print(fread($fp, 0x2000));
- fseek($fp, 0x2000, SEEK_CUR);
- print(fread($fp, 0x2000));
- fseek($fp, 0x2000, SEEK_CUR);
- print(fread($fp, 0x2000));
- fseek($fp, 0x2000, SEEK_CUR);
- print(fread($fp, 0x2000));
- }
- // Writing last block
- print(pack("NNN", $lastBlockSize, $lastBlockSize - 1, $loopStartBlock) . substr($coeffL, 0x22, 6) . pack("n", 0) . substr($coeffR, 0x22, 6) . pack("nN", 0, 0));
- $i = 0;
- fseek($fp, -($lastBlockSize), SEEK_END);
- if ($lastBlockSize >= 0x4000) {
- print(fread($fp, 0x2000));
- fseek($fp, 0x2000, SEEK_CUR);
- for ($i = 0; $i < (floor($lastBlockSize / 0x4000) - 1); $i++) {
- print(fread($fp, 0x2000));
- fseek($fp, 0x2000, SEEK_CUR);
- }
- }
- print(fread($fp, $interleaveShortBlock));
- fseek($fp, -$lastBlockSize, SEEK_END);
- if ($lastBlockSize >= 0x4000) {
- fseek($fp, 0x2000, SEEK_CUR);
- print(fread($fp, 0x2000));
- for ($i = 0; $i < (floor($lastBlockSize / 0x4000) - 1); $i++) {
- fseek($fp, 0x2000, SEEK_CUR);
- print(fread($fp, 0x2000));
- }
- }
- fseek($fp, -($interleaveShortBlock), SEEK_END);
- print(fread($fp, $interleaveShortBlock));
- }
- ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement