Lines Matching refs:stream

87 /* Get the speed of the stream. */
89 sonicStream stream)
91 return stream->speed;
94 /* Set the speed of the stream. */
96 sonicStream stream,
99 stream->speed = speed;
102 /* Get the pitch of the stream. */
104 sonicStream stream)
106 return stream->pitch;
109 /* Set the pitch of the stream. */
111 sonicStream stream,
114 stream->pitch = pitch;
117 /* Get the rate of the stream. */
119 sonicStream stream)
121 return stream->rate;
124 /* Set the playback rate of the stream. This scales pitch and speed at the same time. */
126 sonicStream stream,
129 stream->rate = rate;
131 stream->oldRatePosition = 0;
132 stream->newRatePosition = 0;
137 sonicStream stream)
139 return stream->useChordPitch;
144 sonicStream stream,
147 stream->useChordPitch = useChordPitch;
152 sonicStream stream)
154 return stream->quality;
159 sonicStream stream,
162 stream->quality = quality;
165 /* Get the scaling factor of the stream. */
167 sonicStream stream)
169 return stream->volume;
172 /* Set the scaling factor of the stream. */
174 sonicStream stream,
177 stream->volume = volume;
180 /* Free stream buffers. */
182 sonicStream stream)
184 if(stream->inputBuffer != NULL) {
185 free(stream->inputBuffer);
187 if(stream->outputBuffer != NULL) {
188 free(stream->outputBuffer);
190 if(stream->pitchBuffer != NULL) {
191 free(stream->pitchBuffer);
193 if(stream->downSampleBuffer != NULL) {
194 free(stream->downSampleBuffer);
198 /* Destroy the sonic stream. */
200 sonicStream stream)
202 freeStreamBuffers(stream);
203 free(stream);
206 /* Allocate stream buffers. */
208 sonicStream stream,
216 stream->inputBufferSize = maxRequired;
217 stream->inputBuffer = (short *)calloc(maxRequired, sizeof(short)*numChannels);
218 if(stream->inputBuffer == NULL) {
219 sonicDestroyStream(stream);
222 stream->outputBufferSize = maxRequired;
223 stream->outputBuffer = (short *)calloc(maxRequired, sizeof(short)*numChannels);
224 if(stream->outputBuffer == NULL) {
225 sonicDestroyStream(stream);
228 stream->pitchBufferSize = maxRequired;
229 stream->pitchBuffer = (short *)calloc(maxRequired, sizeof(short)*numChannels);
230 if(stream->pitchBuffer == NULL) {
231 sonicDestroyStream(stream);
234 stream->downSampleBuffer = (short *)calloc(maxRequired, sizeof(short));
235 if(stream->downSampleBuffer == NULL) {
236 sonicDestroyStream(stream);
239 stream->sampleRate = sampleRate;
240 stream->numChannels = numChannels;
241 stream->oldRatePosition = 0;
242 stream->newRatePosition = 0;
243 stream->minPeriod = minPeriod;
244 stream->maxPeriod = maxPeriod;
245 stream->maxRequired = maxRequired;
246 stream->prevPeriod = 0;
250 /* Create a sonic stream. Return NULL only if we are out of memory and cannot
251 allocate the stream. */
256 sonicStream stream = (sonicStream)calloc(1, sizeof(struct sonicStreamStruct));
258 if(stream == NULL) {
261 if(!allocateStreamBuffers(stream, sampleRate, numChannels)) {
264 stream->speed = 1.0f;
265 stream->pitch = 1.0f;
266 stream->volume = 1.0f;
267 stream->rate = 1.0f;
268 stream->oldRatePosition = 0;
269 stream->newRatePosition = 0;
270 stream->useChordPitch = 0;
271 stream->quality = 0;
272 return stream;
275 /* Get the sample rate of the stream. */
277 sonicStream stream)
279 return stream->sampleRate;
282 /* Set the sample rate of the stream. This will cause samples buffered in the stream to
285 sonicStream stream,
288 freeStreamBuffers(stream);
289 allocateStreamBuffers(stream, sampleRate, stream->numChannels);
294 sonicStream stream)
296 return stream->numChannels;
299 /* Set the num channels of the stream. This will cause samples buffered in the stream to
302 sonicStream stream,
305 freeStreamBuffers(stream);
306 allocateStreamBuffers(stream, stream->sampleRate, numChannels);
311 sonicStream stream,
314 if(stream->numOutputSamples + numSamples > stream->outputBufferSize) {
315 stream->outputBufferSize += (stream->outputBufferSize >> 1) + numSamples;
316 stream->outputBuffer = (short *)realloc(stream->outputBuffer,
317 stream->outputBufferSize*sizeof(short)*stream->numChannels);
318 if(stream->outputBuffer == NULL) {
327 sonicStream stream,
330 if(stream->numInputSamples + numSamples > stream->inputBufferSize) {
331 stream->inputBufferSize += (stream->inputBufferSize >> 1) + numSamples;
332 stream->inputBuffer = (short *)realloc(stream->inputBuffer,
333 stream->inputBufferSize*sizeof(short)*stream->numChannels);
334 if(stream->inputBuffer == NULL) {
343 sonicStream stream,
348 int count = numSamples*stream->numChannels;
353 if(!enlargeInputBufferIfNeeded(stream, numSamples)) {
356 buffer = stream->inputBuffer + stream->numInputSamples*stream->numChannels;
360 stream->numInputSamples += numSamples;
366 sonicStream stream,
373 if(!enlargeInputBufferIfNeeded(stream, numSamples)) {
376 memcpy(stream->inputBuffer + stream->numInputSamples*stream->numChannels, samples,
377 numSamples*sizeof(short)*stream->numChannels);
378 stream->numInputSamples += numSamples;
384 sonicStream stream,
389 int count = numSamples*stream->numChannels;
394 if(!enlargeInputBufferIfNeeded(stream, numSamples)) {
397 buffer = stream->inputBuffer + stream->numInputSamples*stream->numChannels;
401 stream->numInputSamples += numSamples;
407 sonicStream stream,
410 int remainingSamples = stream->numInputSamples - position;
413 memmove(stream->inputBuffer, stream->inputBuffer + position*stream->numChannels,
414 remainingSamples*sizeof(short)*stream->numChannels);
416 stream->numInputSamples = remainingSamples;
421 sonicStream stream,
425 if(!enlargeOutputBufferIfNeeded(stream, numSamples)) {
428 memcpy(stream->outputBuffer + stream->numOutputSamples*stream->numChannels,
429 samples, numSamples*sizeof(short)*stream->numChannels);
430 stream->numOutputSamples += numSamples;
437 sonicStream stream,
440 int numSamples = stream->remainingInputToCopy;
442 if(numSamples > stream->maxRequired) {
443 numSamples = stream->maxRequired;
445 if(!copyToOutput(stream, stream->inputBuffer + position*stream->numChannels,
449 stream->remainingInputToCopy -= numSamples;
453 /* Read data out of the stream. Sometimes no data will be available, and zero
456 sonicStream stream,
460 int numSamples = stream->numOutputSamples;
472 buffer = stream->outputBuffer;
473 count = numSamples*stream->numChannels;
478 memmove(stream->outputBuffer, stream->outputBuffer + numSamples*stream->numChannels,
479 remainingSamples*sizeof(short)*stream->numChannels);
481 stream->numOutputSamples = remainingSamples;
485 /* Read short data out of the stream. Sometimes no data will be available, and zero
488 sonicStream stream,
492 int numSamples = stream->numOutputSamples;
502 memcpy(samples, stream->outputBuffer, numSamples*sizeof(short)*stream->numChannels);
504 memmove(stream->outputBuffer, stream->outputBuffer + numSamples*stream->numChannels,
505 remainingSamples*sizeof(short)*stream->numChannels);
507 stream->numOutputSamples = remainingSamples;
511 /* Read unsigned char data out of the stream. Sometimes no data will be available, and zero
514 sonicStream stream,
518 int numSamples = stream->numOutputSamples;
530 buffer = stream->outputBuffer;
531 count = numSamples*stream->numChannels;
536 memmove(stream->outputBuffer, stream->outputBuffer + numSamples*stream->numChannels,
537 remainingSamples*sizeof(short)*stream->numChannels);
539 stream->numOutputSamples = remainingSamples;
543 /* Force the sonic stream to generate output using whatever data it currently
547 sonicStream stream)
549 int maxRequired = stream->maxRequired;
550 int remainingSamples = stream->numInputSamples;
551 float speed = stream->speed/stream->pitch;
552 float rate = stream->rate*stream->pitch;
553 int expectedOutputSamples = stream->numOutputSamples +
554 (int)((remainingSamples/speed + stream->numPitchSamples)/rate + 0.5f);
557 if(!enlargeInputBufferIfNeeded(stream, remainingSamples + 2*maxRequired)) {
560 memset(stream->inputBuffer + remainingSamples*stream->numChannels, 0,
561 2*maxRequired*sizeof(short)*stream->numChannels);
562 stream->numInputSamples += 2*maxRequired;
563 if(!sonicWriteShortToStream(stream, NULL, 0)) {
567 if(stream->numOutputSamples > expectedOutputSamples) {
568 stream->numOutputSamples = expectedOutputSamples;
571 stream->numInputSamples = 0;
572 stream->remainingInputToCopy = 0;
573 stream->numPitchSamples = 0;
579 sonicStream stream)
581 return stream->numOutputSamples;
588 sonicStream stream,
592 int numSamples = stream->maxRequired/skip;
593 int samplesPerValue = stream->numChannels*skip;
596 short *downSamples = stream->downSampleBuffer;
652 sonicStream stream,
658 if(minDiff == 0 || stream->prevPeriod == 0) {
666 if(minDiff*2 <= stream->prevMinDiff*3) {
671 if(minDiff <= stream->prevMinDiff) {
683 sonicStream stream,
687 int minPeriod = stream->minPeriod;
688 int maxPeriod = stream->maxPeriod;
689 int sampleRate = stream->sampleRate;
694 if(sampleRate > SONIC_AMDF_FREQ && stream->quality == 0) {
697 if(stream->numChannels == 1 && skip == 1) {
700 downSampleInput(stream, samples, skip);
701 period = findPitchPeriodInRange(stream->downSampleBuffer, minPeriod/skip,
707 if(minPeriod < stream->minPeriod) {
708 minPeriod = stream->minPeriod;
710 if(maxPeriod > stream->maxPeriod) {
711 maxPeriod = stream->maxPeriod;
713 if(stream->numChannels == 1) {
717 downSampleInput(stream, samples, 1);
718 period = findPitchPeriodInRange(stream->downSampleBuffer, minPeriod,
723 if(prevPeriodBetter(stream, period, minDiff, maxDiff, preferNewPeriod)) {
724 retPeriod = stream->prevPeriod;
728 stream->prevMinDiff = minDiff;
729 stream->prevPeriod = period;
799 sonicStream stream,
802 int numSamples = stream->numOutputSamples - originalNumOutputSamples;
803 int numChannels = stream->numChannels;
805 if(stream->numPitchSamples + numSamples > stream->pitchBufferSize) {
806 stream->pitchBufferSize += (stream->pitchBufferSize >> 1) + numSamples;
807 stream->pitchBuffer = (short *)realloc(stream->pitchBuffer,
808 stream->pitchBufferSize*sizeof(short)*numChannels);
809 if(stream->pitchBuffer == NULL) {
813 memcpy(stream->pitchBuffer + stream->numPitchSamples*numChannels,
814 stream->outputBuffer + originalNumOutputSamples*numChannels,
816 stream->numOutputSamples = originalNumOutputSamples;
817 stream->numPitchSamples += numSamples;
823 sonicStream stream,
826 int numChannels = stream->numChannels;
827 short *source = stream->pitchBuffer + numSamples*numChannels;
832 if(numSamples != stream->numPitchSamples) {
833 memmove(stream->pitchBuffer, source, (stream->numPitchSamples -
836 stream->numPitchSamples -= numSamples;
842 sonicStream stream,
845 float pitch = stream->pitch;
846 int numChannels = stream->numChannels;
851 if(stream->numOutputSamples == originalNumOutputSamples) {
854 if(!moveNewSamplesToPitchBuffer(stream, originalNumOutputSamples)) {
857 while(stream->numPitchSamples - position >= stream->maxRequired) {
858 period = findPitchPeriod(stream, stream->pitchBuffer + position*numChannels, 0);
860 if(!enlargeOutputBufferIfNeeded(stream, newPeriod)) {
863 out = stream->outputBuffer + stream->numOutputSamples*numChannels;
865 rampDown = stream->pitchBuffer + position*numChannels;
866 rampUp = stream->pitchBuffer + (position + period - newPeriod)*numChannels;
869 rampDown = stream->pitchBuffer + position*numChannels;
870 rampUp = stream->pitchBuffer + position*numChannels;
874 stream->numOutputSamples += newPeriod;
877 removePitchSamples(stream, position);
883 sonicStream stream,
889 short right = in[stream->numChannels];
890 int position = stream->newRatePosition*oldSampleRate;
891 int leftPosition = stream->oldRatePosition*newSampleRate;
892 int rightPosition = (stream->oldRatePosition + 1)*newSampleRate;
901 sonicStream stream,
905 int newSampleRate = stream->sampleRate/rate;
906 int oldSampleRate = stream->sampleRate;
907 int numChannels = stream->numChannels;
917 if(stream->numOutputSamples == originalNumOutputSamples) {
920 if(!moveNewSamplesToPitchBuffer(stream, originalNumOutputSamples)) {
924 for(position = 0; position < stream->numPitchSamples - 1; position++) {
925 while((stream->oldRatePosition + 1)*newSampleRate >
926 stream->newRatePosition*oldSampleRate) {
927 if(!enlargeOutputBufferIfNeeded(stream, 1)) {
930 out = stream->outputBuffer + stream->numOutputSamples*numChannels;
931 in = stream->pitchBuffer + position;
933 *out++ = interpolate(stream, in, oldSampleRate, newSampleRate);
936 stream->newRatePosition++;
937 stream->numOutputSamples++;
939 stream->oldRatePosition++;
940 if(stream->oldRatePosition == oldSampleRate) {
941 stream->oldRatePosition = 0;
942 if(stream->newRatePosition != newSampleRate) {
944 "Assertion failed: stream->newRatePosition != newSampleRate\n");
947 stream->newRatePosition = 0;
950 removePitchSamples(stream, position);
957 sonicStream stream,
963 int numChannels = stream->numChannels;
969 stream->remainingInputToCopy = period*(2.0f - speed)/(speed - 1.0f);
971 if(!enlargeOutputBufferIfNeeded(stream, newSamples)) {
974 overlapAdd(newSamples, numChannels, stream->outputBuffer +
975 stream->numOutputSamples*numChannels, samples, samples + period*numChannels);
976 stream->numOutputSamples += newSamples;
982 sonicStream stream,
989 int numChannels = stream->numChannels;
995 stream->remainingInputToCopy = period*(2.0f*speed - 1.0f)/(1.0f - speed);
997 if(!enlargeOutputBufferIfNeeded(stream, period + newSamples)) {
1000 out = stream->outputBuffer + stream->numOutputSamples*numChannels;
1002 out = stream->outputBuffer + (stream->numOutputSamples + period)*numChannels;
1004 stream->numOutputSamples += period + newSamples;
1011 sonicStream stream,
1015 int numSamples = stream->numInputSamples;
1017 int maxRequired = stream->maxRequired;
1019 if(stream->numInputSamples < maxRequired) {
1023 if(stream->remainingInputToCopy > 0) {
1024 newSamples = copyInputToOutput(stream, position);
1027 samples = stream->inputBuffer + position*stream->numChannels;
1028 period = findPitchPeriod(stream, samples, 1);
1030 newSamples = skipPitchPeriod(stream, samples, speed, period);
1033 newSamples = insertPitchPeriod(stream, samples, speed, period);
1041 removeInputSamples(stream, position);
1048 sonicStream stream)
1050 int originalNumOutputSamples = stream->numOutputSamples;
1051 float speed = stream->speed/stream->pitch;
1052 float rate = stream->rate;
1054 if(!stream->useChordPitch) {
1055 rate *= stream->pitch;
1058 changeSpeed(stream, speed);
1060 if(!copyToOutput(stream, stream->inputBuffer, stream->numInputSamples)) {
1063 stream->numInputSamples = 0;
1065 if(stream->useChordPitch) {
1066 if(stream->pitch != 1.0f) {
1067 if(!adjustPitch(stream, originalNumOutputSamples)) {
1072 if(!adjustRate(stream, rate, originalNumOutputSamples)) {
1076 if(stream->volume != 1.0f) {
1078 scaleSamples(stream->outputBuffer + originalNumOutputSamples*stream->numChannels,
1079 (stream->numOutputSamples - originalNumOutputSamples)*stream->numChannels,
1080 stream->volume);
1087 sonicStream stream,
1091 if(!addFloatSamplesToInputBuffer(stream, samples, numSamples)) {
1094 return processStreamInput(stream);
1100 sonicStream stream,
1104 if(!addShortSamplesToInputBuffer(stream, samples, numSamples)) {
1107 return processStreamInput(stream);
1113 sonicStream stream,
1117 if(!addUnsignedCharSamplesToInputBuffer(stream, samples, numSamples)) {
1120 return processStreamInput(stream);
1123 /* This is a non-stream oriented interface to just change the speed of a sound sample */
1135 sonicStream stream = sonicCreateStream(sampleRate, numChannels);
1137 sonicSetSpeed(stream, speed);
1138 sonicSetPitch(stream, pitch);
1139 sonicSetRate(stream, rate);
1140 sonicSetVolume(stream, volume);
1141 sonicSetChordPitch(stream, useChordPitch);
1142 sonicWriteFloatToStream(stream, samples, numSamples);
1143 sonicFlushStream(stream);
1144 numSamples = sonicSamplesAvailable(stream);
1145 sonicReadFloatFromStream(stream, samples, numSamples);
1146 sonicDestroyStream(stream);
1150 /* This is a non-stream oriented interface to just change the speed of a sound sample */
1162 sonicStream stream = sonicCreateStream(sampleRate, numChannels);
1164 sonicSetSpeed(stream, speed);
1165 sonicSetPitch(stream, pitch);
1166 sonicSetRate(stream, rate);
1167 sonicSetVolume(stream, volume);
1168 sonicSetChordPitch(stream, useChordPitch);
1169 sonicWriteShortToStream(stream, samples, numSamples);
1170 sonicFlushStream(stream);
1171 numSamples = sonicSamplesAvailable(stream);
1172 sonicReadShortFromStream(stream, samples, numSamples);
1173 sonicDestroyStream(stream);