Lines Matching defs:info

274 /* multi-channel info: http://www.microsoft.com/whdc/hwdev/tech/audio/multichaud.mspx */
426 static HRESULT StartBuffer(DS_Info* info);
500 HRESULT DS_StartBufferHelper::StartBuffer(DS_Info* info) {
507 data.line2Start = info;
519 inline int DS_getDistance(DS_Info* info, int pos1, int pos2) {
522 distance += info->dsBufferSizeInBytes;
528 inline int DS_addPos(DS_Info* info, int pos1, int pos2) {
530 while (result >= info->dsBufferSizeInBytes)
531 result -= info->dsBufferSizeInBytes;
657 void DS_clearBuffer(DS_Info* info, BOOL fromWritePos) {
662 TRACE1("> DS_clearBuffer for device %d\n", info->deviceID);
663 if (info->isSource) {
667 if (FAILED(info->playBuffer->GetCurrentPosition(&playCursor, &writeCursor))) {
672 DEBUG_SILENCING2(" DS_clearBuffer: DS playPos=%d myWritePos=%d", (int) playCursor, (int) info->writePos);
673 if (info->writePos >= 0) {
674 start = info->writePos + info->silencedBytes;
676 start = writeCursor + info->silencedBytes;
679 while (start >= info->dsBufferSizeInBytes) {
680 start -= info->dsBufferSizeInBytes;
696 count = info->dsBufferSizeInBytes - info->silencedBytes;
698 //if (count > info->dsBufferSizeInBytes / 4) {
699 // count = info->dsBufferSizeInBytes / 4;
703 playCursor += (DWORD) info->dsBufferSizeInBytes;
709 if ((int) playCursor >= info->dsBufferSizeInBytes) playCursor -= (DWORD) info->dsBufferSizeInBytes;
718 TRACE1("< DS_clearBuffer: no need to clear, silencedBytes=%d\n", info->silencedBytes);
723 count = info->dsBufferSizeInBytes;
726 if (FAILED(info->playBuffer->Lock(start,
735 if (FAILED(info->captureBuffer->Lock(0,
736 info->dsBufferSizeInBytes,
745 memset(pb1, (info->bitsPerSample == 8)?128:0, cb1);
748 memset(pb2, (info->bitsPerSample == 8)?128:0, cb2);
750 if (info->isSource) {
751 info->playBuffer->Unlock( pb1, cb1, pb2, cb2 );
754 info->writePos = -1;
755 info->silencedBytes = info->dsBufferSizeInBytes;
757 info->silencedBytes += (cb1+cb2);
758 if (info->silencedBytes > info->dsBufferSizeInBytes) {
760 info->silencedBytes);
761 info->silencedBytes = info->dsBufferSizeInBytes;
764 DEBUG_SILENCING2(" silencedBytes=%d, my writePos=%d\n", (int)info->silencedBytes, (int)info->writePos);
766 info->captureBuffer->Unlock( pb1, cb1, pb2, cb2 );
772 void* DS_createSoundBuffer(DS_Info* info,
783 TRACE1("Creating secondary buffer for device %d\n", info->deviceID);
787 info->frameSize / channels * 8,
791 info->dsBufferSizeInBytes = 2 * ((int) sampleRate) * info->frameSize;
793 if (bufferSizeInBytes > info->dsBufferSizeInBytes / 2) {
794 bufferSizeInBytes = info->dsBufferSizeInBytes / 2;
796 bufferSizeInBytes = (bufferSizeInBytes / info->frameSize) * info->frameSize;
797 info->bufferSizeInBytes = bufferSizeInBytes;
799 if (info->isSource) {
805 dsbdesc.dwBufferBytes = info->dsBufferSizeInBytes;
807 res = DEV_PLAY(info->deviceID)->CreateSoundBuffer
813 dscbdesc.dwBufferBytes = info->dsBufferSizeInBytes;
815 res = DEV_CAPTURE(info->deviceID)->CreateCaptureBuffer
825 void DS_destroySoundBuffer(DS_Info* info) {
826 if (info->playBuffer != NULL) {
827 info->playBuffer->Release();
828 info->playBuffer = NULL;
830 if (info->captureBuffer != NULL) {
831 info->captureBuffer->Release();
832 info->captureBuffer = NULL;
842 DS_Info* info;
881 info = (DS_Info*) malloc(sizeof(DS_Info));
882 if (!info) {
886 memset(info, 0, sizeof(DS_Info));
888 info->deviceID = deviceID;
889 info->isSource = isSource;
890 info->bitsPerSample = sampleSizeInBits;
891 info->frameSize = frameSize;
892 info->framePos = 0;
893 info->started = FALSE;
894 info->underrun = FALSE;
898 free(info);
902 buffer = DS_createSoundBuffer(info,
909 free(info);
913 if (info->isSource) {
914 info->playBuffer = (LPDIRECTSOUNDBUFFER) buffer;
916 info->captureBuffer = (LPDIRECTSOUNDCAPTUREBUFFER) buffer;
918 DS_clearBuffer(info, FALSE /* entire buffer */);
921 if (info->isSource) {
922 info->writePos = -1;
924 info->writePos = 0;
928 return (void*) info;
932 DS_Info* info = (DS_Info*) id;
938 if (info->isSource) {
939 res = info->playBuffer->GetStatus(&status);
947 if (info->writePos >= 0) {
948 res = DS_StartBufferHelper::StartBuffer(info);
950 res = info->playBuffer->Restore();
952 DS_clearBuffer(info, FALSE /* entire buffer */);
958 DS_clearBuffer(info, TRUE /* from write position */);
963 if (info->captureBuffer->GetStatus(&status) == DS_OK) {
969 res = DS_StartBufferHelper::StartBuffer(info);
975 info->started = TRUE;
980 DS_Info* info = (DS_Info*) id;
984 info->started = FALSE;
985 if (info->isSource) {
986 info->playBuffer->Stop();
988 info->captureBuffer->Stop();
997 DS_Info* info = (DS_Info*) id;
1001 if (info != NULL) {
1002 DS_destroySoundBuffer(info);
1003 DS_removeDeviceRef(info->deviceID);
1004 free(info);
1011 void DS_CheckUnderrun(DS_Info* info, DWORD playCursor, DWORD writeCursor) {
1013 "info->writePos=%d silencedBytes=%d dsBufferSizeInBytes=%d\n",
1014 (int) playCursor, (int) writeCursor, (int) info->writePos,
1015 (int) info->silencedBytes, (int) info->dsBufferSizeInBytes);
1016 if (info->underrun || info->writePos < 0) return;
1017 int writeAhead = DS_getDistance(info, writeCursor, info->writePos);
1018 if (writeAhead > info->bufferSizeInBytes) {
1020 // But the case can occur only when we have more then info->bufferSizeInBytes valid bytes
1021 // (and less then (info->dsBufferSizeInBytes - info->bufferSizeInBytes) silenced bytes)
1024 if (info->silencedBytes >= info->dsBufferSizeInBytes - info->bufferSizeInBytes) {
1027 info->underrun = TRUE;
1034 * for writing: bufferSize - (info->writePos - writeCursor);
1040 * for reading from the buffer: readCursor - info->writePos;
1045 * if (fromPlayCursor == FALSE), bufferSize = info->bufferSizeInBytes
1049 int DS_GetAvailable(DS_Info* info,
1055 TRACE2("DS_GetAvailable: fromPlayCursor=%d, deviceID=%d\n", fromPlayCursor, info->deviceID);
1056 if (!info->playBuffer && !info->captureBuffer) {
1061 if (info->isSource) {
1062 if (FAILED(info->playBuffer->GetCurrentPosition(playCursor, writeCursor))) {
1066 int processing = DS_getDistance(info, (int)*playCursor, (int)*writeCursor);
1068 if (processing > info->dsBufferSizeInBytes / 2) {
1072 TRACE3(" playCursor=%d, writeCursor=%d, info->writePos=%d\n",
1073 *playCursor, *writeCursor, info->writePos);
1074 *bufferSize = info->bufferSizeInBytes;
1078 DS_CheckUnderrun(info, *playCursor, *writeCursor);
1079 if (info->writePos == -1 || (info->underrun && !fromPlayCursor)) {
1083 int currWriteAhead = DS_getDistance(info, fromPlayCursor ? (int)*playCursor : (int)*writeCursor, info->writePos);
1085 if (info->underrun) {
1099 if (FAILED(info->captureBuffer->GetCurrentPosition(playCursor, writeCursor))) {
1103 *bufferSize = info->bufferSizeInBytes;
1105 *bufferSize += DS_getDistance(info, (int)*playCursor, (int)*writeCursor);
1107 TRACE4(" captureCursor=%d, readCursor=%d, info->readPos=%d refBufferSize=%d\n",
1108 *playCursor, *writeCursor, info->writePos, *bufferSize);
1109 if (info->writePos == -1) {
1111 info->writePos = (int) (*writeCursor);
1114 available = ((int) (*playCursor) - info->writePos);
1116 available = ((int) (*writeCursor) - info->writePos);
1119 available += info->dsBufferSizeInBytes;
1121 if (!fromPlayCursor && available > info->bufferSizeInBytes) {
1125 info->dsBufferSizeInBytes, info->bufferSizeInBytes);
1126 ERROR3("captureCursor=%d, readCursor=%d, info->readPos=%d\n",
1127 *playCursor, *writeCursor, info->writePos);
1129 newReadPos = (int) (*writeCursor) - info->bufferSizeInBytes;
1131 newReadPos += info->dsBufferSizeInBytes;
1133 info->writePos = newReadPos;
1134 available = info->bufferSizeInBytes;
1137 available = (available / info->frameSize) * info->frameSize;
1145 DS_Info* info = (DS_Info*) id;
1159 available = DS_GetAvailable(info, &playCursor, &writeCursor, &bufferSize, FALSE /* fromPlayCursor */);
1162 thisWritePos = info->writePos;
1163 if (thisWritePos == -1 || info->underrun) {
1167 info->underrun = FALSE;
1170 res = info->playBuffer->Lock(thisWritePos, byteSize,
1178 if (info->playBuffer->Restore() == DS_OK) {
1179 DS_clearBuffer(info, FALSE /* entire buffer */);
1180 info->writePos = -1;
1202 while (thisWritePos >= info->dsBufferSizeInBytes) {
1203 thisWritePos -= info->dsBufferSizeInBytes;
1206 info->playBuffer->Unlock(buffer1, buffer1len, buffer2, buffer2len);
1208 info->writePos = thisWritePos;
1215 info->framePos += (byteSize / info->frameSize);
1218 if (info->silencedBytes > byteSize) {
1219 info->silencedBytes -= byteSize;
1221 info->silencedBytes = 0;
1227 if (info->started && needRestart && (info->writePos >= 0)) {
1228 DS_StartBufferHelper::StartBuffer(info);
1237 DS_Info* info = (DS_Info*) id;
1248 available = DS_GetAvailable(info, &captureCursor, &readCursor, &bufferSize, FALSE /* fromCaptureCursor? */);
1251 thisReadPos = info->writePos;
1256 res = info->captureBuffer->Lock(thisReadPos, byteSize,
1276 thisReadPos = DS_addPos(info, thisReadPos, byteSize);
1278 info->captureBuffer->Unlock(buffer1, buffer1len, buffer2, buffer2len);
1285 info->framePos += (byteSize / info->frameSize);
1287 info->writePos = thisReadPos;
1297 DS_Info* info = (DS_Info*) id;
1298 return info->bufferSizeInBytes;
1302 DS_Info* info = (DS_Info*) id;
1307 DS_clearBuffer(info, TRUE /* from write position */);
1308 available = DS_GetAvailable(info, &playCursor, &writeCursor, &bufferSize, TRUE /* fromPlayCursor */);
1312 available, info->silencedBytes, draining?"TRUE":"FALSE");
1318 DS_Info* info = (DS_Info*) id;
1322 if (info->isSource) {
1323 info->playBuffer->Stop();
1324 DS_clearBuffer(info, FALSE /* entire buffer */);
1328 if (FAILED(info->captureBuffer->GetCurrentPosition(&captureCursor, &readCursor))) {
1332 DS_clearBuffer(info, FALSE /* entire buffer */);
1337 info->writePos = (int) readCursor;
1343 DS_Info* info = (DS_Info*) id;
1347 ret = DS_GetAvailable(info, &playCursor, &writeCursor, &bufferSize, /*fromPlayCursor?*/ FALSE);
1353 INT64 estimatePositionFromAvail(DS_Info* info, INT64 javaBytePos, int bufferSize, int availInBytes) {
1360 if (info->isSource) {
1371 DS_Info* info = (DS_Info*) id;
1376 available = DS_GetAvailable(info, &playCursor, &writeCursor, &bufferSize, /*fromPlayCursor?*/ TRUE);
1377 result = estimatePositionFromAvail(info, javaBytePos, bufferSize, available);
1394 DS_Info* info = (DS_Info*) id;
1396 if (info->silencedBytes < info->dsBufferSizeInBytes) {
1399 DS_clearBuffer(info, TRUE /* from write position */);
1401 if (info->writePos >= 0
1402 && info->started
1403 && !info->underrun
1404 && info->silencedBytes >= info->dsBufferSizeInBytes) {
1407 info->underrun = TRUE;