Уважаемые профи! Написал программу записи нескольких потоков аудио данных с АЦП(специальная плата PCI). Программа работает, но при прослушивании записи слышны потери данных, причем достаточно большие... Пропадают куски слов или даже целые слова. Программа написана для Linux 64 bit (хотя писал в Ubuntu 32bit). Грешу на специфику 64 битной системы, но сам найти косяк не могу... Помогите разобраться. Заранее спасибо.
вот основные методы программы (без АЦП программа работать не будет):
1. Метод вызывается из другого потока, beginPoint это unsigned int*
<code>
void *ThreadsManager::readThread(void *arg)
{
CHECK;
ThreadsManager *obj = static_cast<ThreadsManager*>(arg);
int chan = obj->chan;
int kadr = obj->kadr;
int step = 0;
int delta = 0;
unsigned short *buffer = new unsigned short[32768];
int silentCount = 0;
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL);
// pthread_cleanup_push(obj->exitHandler, (void*)obj);
while (1)
{
while (delta < 64 * 2)
{
usleep(100);
delta = (posPoint[I_ADC_PCI_COUNT_L791] >= (kadr + chan) * 4) ?
(posPoint[I_ADC_PCI_COUNT_L791] - (kadr + chan) * 4) : (obj->size - (kadr + chan) * 4 + posPoint[I_ADC_PCI_COUNT_L791]);
}CHECK;
buffer[step] =
(unsigned short)((beginPoint[kadr + chan] & 0xFFFF) << 2);
step += 1;
if (step == 32768)
{
obj->writeData(buffer, step, chan);
fprintf(stderr, "write %i byte of data\n", strlen((char*)buffer));
memset(buffer, 0, step * 2);
step = 0;
}
if ((chan < 8) && (!chanChecker[chan]))
{
obj->writeData(buffer, step, chan);
fprintf(stderr, "write %i byte of data (button off)\n",
strlen((char*)buffer));
memset(buffer, 0, step * 2);
step = 0;
break;
}
else if (abs((int)beginPoint[kadr + chan]) < 200)
{
fprintf(stderr, "->for analog channel...\n");
if ((silentCount += 1) == 100)
{
obj->writeData(buffer, step, chan);
memset(buffer, 0, step * 2);
step = 0;
break;
}
}
else
silentCount = 0;
if ((kadr += 16) == obj->size / 4) kadr = 0;
CHECK;
usleep(100);
}
obj->saveToWav(obj->rate, chan);
obj->threadBusy[chan] = false;
delete[] buffer;
CHECK;
pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
pthread_exit(0);
// pthread_cleanup_pop(1);
return NULL;
}
</code>
2. Метод записи в файл:
<code>
int FileManager::writeData(unsigned short *ptr, int size, int chanNo)
{
CHECK;
if (!outFileArray[chanNo].is_open())
{
fprintf(stderr, "->error: file for channel %i was not opened\n",
chanNo);
return -1;
}
outFileArray[chanNo].write(reinterpret_cast<char*>(ptr), size * 2);
return 0;
}
</code>
3. На всякий случай, метод, который вызывает readThread:
<code>
void *DeviceAPI::detectThreadFunc(void *arg)
{
CHECK;
int channel = 0;
int kadr = 0;
int delta = 0;
DeviceAPI *obj = static_cast<DeviceAPI*>(arg);
unsigned short *tmp = new unsigned short[1];
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL);
while (1)
{
CHECK;
obj->getTTL();
while (delta < 64 * 2)
{
usleep(100);
delta = (posPoint[I_ADC_PCI_COUNT_L791] >= (kadr + channel) * 4) ?
(posPoint[I_ADC_PCI_COUNT_L791] - (kadr + channel) * 4) :
(obj->size - (kadr + channel) * 4
+ posPoint[I_ADC_PCI_COUNT_L791]);
}
if (!obj->chanBusy(channel) && chanChecker[channel] && (channel < 8))
{
CHECK;
obj->startRead(channel, kadr);
usleep(1000);
}
else if (!obj->chanBusy(channel) && (channel > 8))
{
CHECK;
tmp[0] = (unsigned short)(beginPoint[kadr + channel] & 0xFFFF);
if (abs(tmp[0]) > 50)
{
obj->startRead(channel, kadr);
usleep(1000);
}
}
if ((channel += 1) == 16)
{
channel = 0;
if ((kadr += 16) == obj->size / 4) kadr = 0;
}CHECK;
}
delete []tmp;
pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
pthread_exit(0);
CHECK;
return NULL;
}
</code>
Блин форматирование не работает? Все, жду ваших советов... Спасибо.
Продвижение своими сайтами как стратегия роста и независимости