Mercurial > hg > svcore
comparison data/model/WaveFileModel.cpp @ 176:570794f6f6a7
* Some fixes to updating of writable wave file models
| author | Chris Cannam |
|---|---|
| date | Tue, 03 Oct 2006 15:01:50 +0000 |
| parents | b0f4555b625e |
| children | aff66ec5aea4 |
comparison
equal
deleted
inserted
replaced
| 175:b0f4555b625e | 176:570794f6f6a7 |
|---|---|
| 58 { | 58 { |
| 59 m_reader = reader; | 59 m_reader = reader; |
| 60 connect(m_reader, SIGNAL(frameCountChanged()), | 60 connect(m_reader, SIGNAL(frameCountChanged()), |
| 61 this, SLOT(frameCountChanged())); | 61 this, SLOT(frameCountChanged())); |
| 62 setObjectName(QFileInfo(path).fileName()); | 62 setObjectName(QFileInfo(path).fileName()); |
| 63 if (isOK()) fillCache(); | 63 if (isOK()) { |
| 64 std::cerr << "OK; filling cache" << std::endl; | |
| 65 fillCache(); | |
| 66 } | |
| 64 } | 67 } |
| 65 | 68 |
| 66 WaveFileModel::~WaveFileModel() | 69 WaveFileModel::~WaveFileModel() |
| 67 { | 70 { |
| 68 m_exiting = true; | 71 m_exiting = true; |
| 429 | 432 |
| 430 void | 433 void |
| 431 WaveFileModel::RangeCacheFillThread::frameCountChanged() | 434 WaveFileModel::RangeCacheFillThread::frameCountChanged() |
| 432 { | 435 { |
| 433 m_frameCount = m_model.getFrameCount(); | 436 m_frameCount = m_model.getFrameCount(); |
| 437 std::cerr << "WaveFileModel::RangeCacheFillThread::frameCountChanged: now " | |
| 438 << m_frameCount << std::endl; | |
| 434 } | 439 } |
| 435 | 440 |
| 436 void | 441 void |
| 437 WaveFileModel::RangeCacheFillThread::run() | 442 WaveFileModel::RangeCacheFillThread::run() |
| 438 { | 443 { |
| 450 size_t channels = m_model.getChannelCount(); | 455 size_t channels = m_model.getChannelCount(); |
| 451 | 456 |
| 452 Range *range = new Range[2 * channels]; | 457 Range *range = new Range[2 * channels]; |
| 453 size_t count[2]; | 458 size_t count[2]; |
| 454 count[0] = count[1] = 0; | 459 count[0] = count[1] = 0; |
| 455 | 460 |
| 456 while (frame < m_frameCount) { | 461 bool first = true; |
| 462 bool updating = m_model.m_reader->isUpdating(); | |
| 463 | |
| 464 while (first || updating) { | |
| 465 | |
| 466 updating = m_model.m_reader->isUpdating(); | |
| 457 | 467 |
| 458 std::cerr << "WaveFileModel::fill: frame = " << frame << ", count = " << m_frameCount << std::endl; | 468 std::cerr << "WaveFileModel::fill: frame = " << frame << ", count = " << m_frameCount << std::endl; |
| 459 | 469 |
| 460 m_model.m_reader->getInterleavedFrames(frame, readBlockSize, block); | 470 while (frame < m_frameCount) { |
| 461 | 471 |
| 462 for (size_t i = 0; i < readBlockSize; ++i) { | 472 if (updating && (frame + readBlockSize > m_frameCount)) break; |
| 473 | |
| 474 m_model.m_reader->getInterleavedFrames(frame, readBlockSize, block); | |
| 475 | |
| 476 for (size_t i = 0; i < readBlockSize; ++i) { | |
| 463 | 477 |
| 464 for (size_t ch = 0; ch < size_t(channels); ++ch) { | 478 for (size_t ch = 0; ch < size_t(channels); ++ch) { |
| 465 | 479 |
| 466 size_t index = channels * i + ch; | 480 size_t index = channels * i + ch; |
| 467 if (index >= block.size()) continue; | 481 if (index >= block.size()) continue; |
| 468 float sample = block[index]; | 482 float sample = block[index]; |
| 483 | |
| 484 for (size_t ct = 0; ct < 2; ++ct) { | |
| 485 | |
| 486 size_t rangeIndex = ch * 2 + ct; | |
| 487 | |
| 488 if (sample > range[rangeIndex].max || count[ct] == 0) { | |
| 489 range[rangeIndex].max = sample; | |
| 490 } | |
| 491 if (sample < range[rangeIndex].min || count[ct] == 0) { | |
| 492 range[rangeIndex].min = sample; | |
| 493 } | |
| 494 range[rangeIndex].absmean += fabsf(sample); | |
| 495 } | |
| 496 } | |
| 469 | 497 |
| 498 QMutexLocker locker(&m_model.m_mutex); | |
| 470 for (size_t ct = 0; ct < 2; ++ct) { | 499 for (size_t ct = 0; ct < 2; ++ct) { |
| 500 if (++count[ct] == cacheBlockSize[ct]) { | |
| 501 for (size_t ch = 0; ch < size_t(channels); ++ch) { | |
| 502 size_t rangeIndex = ch * 2 + ct; | |
| 503 range[rangeIndex].absmean /= count[ct]; | |
| 504 m_model.m_cache[ct].push_back(range[rangeIndex]); | |
| 505 range[rangeIndex] = Range(); | |
| 506 } | |
| 507 count[ct] = 0; | |
| 508 } | |
| 509 } | |
| 471 | 510 |
| 472 size_t rangeIndex = ch * 2 + ct; | 511 ++frame; |
| 473 | |
| 474 if (sample > range[rangeIndex].max || count[ct] == 0) { | |
| 475 range[rangeIndex].max = sample; | |
| 476 } | |
| 477 if (sample < range[rangeIndex].min || count[ct] == 0) { | |
| 478 range[rangeIndex].min = sample; | |
| 479 } | |
| 480 range[rangeIndex].absmean += fabsf(sample); | |
| 481 } | |
| 482 } | |
| 483 | |
| 484 QMutexLocker locker(&m_model.m_mutex); | |
| 485 for (size_t ct = 0; ct < 2; ++ct) { | |
| 486 if (++count[ct] == cacheBlockSize[ct]) { | |
| 487 for (size_t ch = 0; ch < size_t(channels); ++ch) { | |
| 488 size_t rangeIndex = ch * 2 + ct; | |
| 489 range[rangeIndex].absmean /= count[ct]; | |
| 490 m_model.m_cache[ct].push_back(range[rangeIndex]); | |
| 491 range[rangeIndex] = Range(); | |
| 492 } | |
| 493 count[ct] = 0; | |
| 494 } | |
| 495 } | 512 } |
| 496 | 513 |
| 497 ++frame; | 514 if (m_model.m_exiting) break; |
| 515 | |
| 516 m_fillExtent = frame; | |
| 498 } | 517 } |
| 499 | 518 |
| 500 if (m_model.m_exiting) break; | 519 first = false; |
| 501 | 520 if (updating) sleep(1); |
| 502 m_fillExtent = frame; | |
| 503 } | 521 } |
| 504 | 522 |
| 505 QMutexLocker locker(&m_model.m_mutex); | 523 QMutexLocker locker(&m_model.m_mutex); |
| 506 for (size_t ct = 0; ct < 2; ++ct) { | 524 for (size_t ct = 0; ct < 2; ++ct) { |
| 507 if (count[ct] > 0) { | 525 if (count[ct] > 0) { |
