| 18 | }; |
| 19 | |
| 20 | int16_t ADPCM2BitStream::nextSample() { |
| 21 | if (!hasNext()) return 0; |
| 22 | |
| 23 | // Get current byte |
| 24 | uint8_t byte = data[byteIndex]; |
| 25 | |
| 26 | // Extract 2-bit code from current position |
| 27 | // Bits are packed: [7:6][5:4][3:2][1:0] = 4 samples per byte |
| 28 | uint8_t shift = 6 - (sampleInByte * 2); // 6, 4, 2, 0 |
| 29 | uint8_t code = (byte >> shift) & 0x03; // Extract 2 bits |
| 30 | |
| 31 | // Get step size |
| 32 | int8_t step = stepTable[stepIndex]; |
| 33 | |
| 34 | // Calculate delta based on code |
| 35 | // For 2-bit, we use simple mapping: |
| 36 | // code 0 (00): -step |
| 37 | // code 1 (01): +step |
| 38 | // code 2 (10): -step*2 |
| 39 | // code 3 (11): +step*2 |
| 40 | int delta; |
| 41 | switch(code) { |
| 42 | case 0: delta = -step; break; |
| 43 | case 1: delta = step; break; |
| 44 | case 2: delta = -step * 2; break; |
| 45 | case 3: delta = step * 2; break; |
| 46 | default: delta = 0; break; |
| 47 | } |
| 48 | |
| 49 | // Update predictor |
| 50 | int newPredictor = predictor + delta; |
| 51 | |
| 52 | // Clamp to 8-bit unsigned range (0-255) |
| 53 | if (newPredictor < 0) newPredictor = 0; |
| 54 | if (newPredictor > 255) newPredictor = 255; |
| 55 | |
| 56 | predictor = (uint8_t)newPredictor; |
| 57 | |
| 58 | // Adapt step size for next sample |
| 59 | stepIndex += indexTable[code]; |
| 60 | if (stepIndex < 0) stepIndex = 0; |
| 61 | if (stepIndex > 15) stepIndex = 15; |
| 62 | |
| 63 | // Move to next sample |
| 64 | sampleInByte++; |
| 65 | if (sampleInByte >= 4) { |
| 66 | sampleInByte = 0; |
| 67 | byteIndex++; |
| 68 | } |
| 69 | |
| 70 | // Convert 8-bit unsigned (0-255) to 16-bit signed (-32768 to 32767) |
| 71 | // Scale: 0->-32768, 128->0, 255->32767 |
| 72 | int16_t sample = ((int16_t)predictor - 128) * 256; |
| 73 | |
| 74 | return sample; |
| 75 | } |