| 63 | } |
| 64 | |
| 65 | PackedVoice packDsiMidiData(UnpackedVoice unpacked) |
| 66 | { |
| 67 | uint8 data[DSI_VOICE_DATA_MAX]; |
| 68 | uint8 packbyte = 0; /* Composite of high bits of next 7 bytes */ |
| 69 | int pos = 0; /* Current position of 7 */ |
| 70 | int ixu; /* Unpacked byte index */ |
| 71 | int size = 0; /* Packed voice size */ |
| 72 | uint8 packet[7]; /* Current packet */ |
| 73 | uint8 i; /* Packet output index */ |
| 74 | unsigned char c; /* Current source byte */ |
| 75 | for (ixu = 0; ixu < unpacked.size; ixu++) |
| 76 | { |
| 77 | c = unpacked.data[ixu]; |
| 78 | if (pos == 7) { |
| 79 | data[size++] = (uint8)packbyte; |
| 80 | for (i = 0; i < pos; i++) |
| 81 | { |
| 82 | data[size++] = packet[i]; |
| 83 | } |
| 84 | packbyte = 0; |
| 85 | pos = 0; |
| 86 | } |
| 87 | if (c & 0x80) { |
| 88 | packbyte += (1 << pos); |
| 89 | c &= 0x7f; |
| 90 | } |
| 91 | packet[pos] = c; |
| 92 | pos++; |
| 93 | if ((size + 8) > DSI_VOICE_DATA_MAX) break; |
| 94 | } |
| 95 | data[size++] = packbyte; |
| 96 | for (i = 0; i < pos; i++) |
| 97 | { |
| 98 | data[size++] = packet[i]; |
| 99 | } |
| 100 | |
| 101 | PackedVoice packed = {size, data}; |
| 102 | return packed; |
| 103 | } |
| 104 | |
| 105 | LMemoryBlock *CtrlrLuaUtils::unpackDsiData (MemoryBlock &dataToUnpack) |
| 106 | { |