MCPcopy Create free account
hub / github.com/atomic14/ch32v003-audio / nextSample

Method nextSample

SamplePlayback/src/ADPCM2BitStream.cpp:20–75  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

18};
19
20int16_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}

Callers 1

playMethod · 0.45

Calls

no outgoing calls

Tested by

no test coverage detected