| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2011 Google Inc. All rights reserved. | 2 * Copyright (C) 2011 Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
| 6 * are met: | 6 * are met: |
| 7 * | 7 * |
| 8 * 1. Redistributions of source code must retain the above copyright | 8 * 1. Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * 2. Redistributions in binary form must reproduce the above copyright | 10 * 2. Redistributions in binary form must reproduce the above copyright |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 54 // value (1.1754944e-38) because we normally operate with flush-to-zero enabled. | 54 // value (1.1754944e-38) because we normally operate with flush-to-zero enabled. |
| 55 const float kSetTargetZeroThreshold = 1e-20; | 55 const float kSetTargetZeroThreshold = 1e-20; |
| 56 | 56 |
| 57 static bool isNonNegativeAudioParamTime(double time, | 57 static bool isNonNegativeAudioParamTime(double time, |
| 58 ExceptionState& exceptionState, | 58 ExceptionState& exceptionState, |
| 59 String message = "Time") { | 59 String message = "Time") { |
| 60 if (time >= 0) | 60 if (time >= 0) |
| 61 return true; | 61 return true; |
| 62 | 62 |
| 63 exceptionState.throwDOMException( | 63 exceptionState.throwDOMException( |
| 64 InvalidAccessError, message + " must be a finite non-negative number: " + | 64 InvalidAccessError, |
| 65 String::number(time)); | 65 message + |
| 66 " must be a finite non-negative number: " + String::number(time)); |
| 66 return false; | 67 return false; |
| 67 } | 68 } |
| 68 | 69 |
| 69 static bool isPositiveAudioParamTime(double time, | 70 static bool isPositiveAudioParamTime(double time, |
| 70 ExceptionState& exceptionState, | 71 ExceptionState& exceptionState, |
| 71 String message) { | 72 String message) { |
| 72 if (time > 0) | 73 if (time > 0) |
| 73 return true; | 74 return true; |
| 74 | 75 |
| 75 exceptionState.throwDOMException( | 76 exceptionState.throwDOMException( |
| (...skipping 412 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 488 ExceptionState& exceptionState) { | 489 ExceptionState& exceptionState) { |
| 489 DCHECK(isMainThread()); | 490 DCHECK(isMainThread()); |
| 490 DCHECK(curve); | 491 DCHECK(curve); |
| 491 | 492 |
| 492 if (!isNonNegativeAudioParamTime(time, exceptionState) || | 493 if (!isNonNegativeAudioParamTime(time, exceptionState) || |
| 493 !isPositiveAudioParamTime(duration, exceptionState, "Duration")) | 494 !isPositiveAudioParamTime(duration, exceptionState, "Duration")) |
| 494 return; | 495 return; |
| 495 | 496 |
| 496 if (curve->length() < 2) { | 497 if (curve->length() < 2) { |
| 497 exceptionState.throwDOMException( | 498 exceptionState.throwDOMException( |
| 498 InvalidStateError, ExceptionMessages::indexExceedsMinimumBound( | 499 InvalidStateError, |
| 499 "curve length", curve->length(), 2U)); | 500 ExceptionMessages::indexExceedsMinimumBound("curve length", |
| 501 curve->length(), 2U)); |
| 500 return; | 502 return; |
| 501 } | 503 } |
| 502 | 504 |
| 503 MutexLocker locker(m_eventsLock); | 505 MutexLocker locker(m_eventsLock); |
| 504 insertEvent(ParamEvent::createSetValueCurveEvent(curve, time, duration), | 506 insertEvent(ParamEvent::createSetValueCurveEvent(curve, time, duration), |
| 505 exceptionState); | 507 exceptionState); |
| 506 | 508 |
| 507 // Insert a setValueAtTime event too to establish an event so that all | 509 // Insert a setValueAtTime event too to establish an event so that all |
| 508 // following events will process from the end of the curve instead of the | 510 // following events will process from the end of the curve instead of the |
| 509 // beginning. | 511 // beginning. |
| (...skipping 19 matching lines...) Expand all Loading... |
| 529 return; | 531 return; |
| 530 | 532 |
| 531 unsigned i = 0; | 533 unsigned i = 0; |
| 532 double insertTime = event->time(); | 534 double insertTime = event->time(); |
| 533 | 535 |
| 534 if (!m_events.size() && | 536 if (!m_events.size() && |
| 535 (event->getType() == ParamEvent::LinearRampToValue || | 537 (event->getType() == ParamEvent::LinearRampToValue || |
| 536 event->getType() == ParamEvent::ExponentialRampToValue)) { | 538 event->getType() == ParamEvent::ExponentialRampToValue)) { |
| 537 // There are no events preceding these ramps. Insert a new setValueAtTime | 539 // There are no events preceding these ramps. Insert a new setValueAtTime |
| 538 // event to set the starting point for these events. | 540 // event to set the starting point for these events. |
| 539 m_events.insert(0, AudioParamTimeline::ParamEvent::createSetValueEvent( | 541 m_events.insert(0, |
| 540 event->initialValue(), event->callTime())); | 542 AudioParamTimeline::ParamEvent::createSetValueEvent( |
| 543 event->initialValue(), event->callTime())); |
| 541 } | 544 } |
| 542 | 545 |
| 543 for (i = 0; i < m_events.size(); ++i) { | 546 for (i = 0; i < m_events.size(); ++i) { |
| 544 if (event->getType() == ParamEvent::SetValueCurve) { | 547 if (event->getType() == ParamEvent::SetValueCurve) { |
| 545 // If this event is a SetValueCurve, make sure it doesn't overlap any | 548 // If this event is a SetValueCurve, make sure it doesn't overlap any |
| 546 // existing event. It's ok if the SetValueCurve starts at the same time as | 549 // existing event. It's ok if the SetValueCurve starts at the same time as |
| 547 // the end of some other duration. | 550 // the end of some other duration. |
| 548 double endTime = event->time() + event->duration(); | 551 double endTime = event->time() + event->duration(); |
| 549 if (m_events[i]->time() > event->time() && | 552 if (m_events[i]->time() > event->time() && |
| 550 m_events[i]->time() < endTime) { | 553 m_events[i]->time() < endTime) { |
| 551 exceptionState.throwDOMException( | 554 exceptionState.throwDOMException( |
| 552 NotSupportedError, | 555 NotSupportedError, |
| 553 eventToString(*event) + " overlaps " + eventToString(*m_events[i])); | 556 eventToString(*event) + " overlaps " + eventToString(*m_events[i])); |
| 554 return; | 557 return; |
| 555 } | 558 } |
| 556 } else { | 559 } else { |
| 557 // Otherwise, make sure this event doesn't overlap any existing | 560 // Otherwise, make sure this event doesn't overlap any existing |
| 558 // SetValueCurve event. | 561 // SetValueCurve event. |
| 559 if (m_events[i]->getType() == ParamEvent::SetValueCurve) { | 562 if (m_events[i]->getType() == ParamEvent::SetValueCurve) { |
| 560 double endTime = m_events[i]->time() + m_events[i]->duration(); | 563 double endTime = m_events[i]->time() + m_events[i]->duration(); |
| 561 if (event->time() >= m_events[i]->time() && event->time() < endTime) { | 564 if (event->time() >= m_events[i]->time() && event->time() < endTime) { |
| 562 exceptionState.throwDOMException( | 565 exceptionState.throwDOMException(NotSupportedError, |
| 563 NotSupportedError, eventToString(*event) + " overlaps " + | 566 eventToString(*event) + |
| 564 eventToString(*m_events[i])); | 567 " overlaps " + |
| 568 eventToString(*m_events[i])); |
| 565 return; | 569 return; |
| 566 } | 570 } |
| 567 } | 571 } |
| 568 } | 572 } |
| 569 | 573 |
| 570 // Overwrite same event type and time. | 574 // Overwrite same event type and time. |
| 571 if (m_events[i]->time() == insertTime && | 575 if (m_events[i]->time() == insertTime && |
| 572 m_events[i]->getType() == event->getType()) { | 576 m_events[i]->getType() == event->getType()) { |
| 573 m_events[i] = std::move(event); | 577 m_events[i] = std::move(event); |
| 574 return; | 578 return; |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 634 break; | 638 break; |
| 635 } | 639 } |
| 636 } | 640 } |
| 637 | 641 |
| 638 // The event that is being cancelled. This is the event just past | 642 // The event that is being cancelled. This is the event just past |
| 639 // cancelTime, if any. | 643 // cancelTime, if any. |
| 640 unsigned cancelledEventIndex = i; | 644 unsigned cancelledEventIndex = i; |
| 641 | 645 |
| 642 // If the event just before cancelTime is a SetTarget or SetValueCurve | 646 // If the event just before cancelTime is a SetTarget or SetValueCurve |
| 643 // event, we need to handle that event specially instead of the event after. | 647 // event, we need to handle that event specially instead of the event after. |
| 644 if (i > 0 && ((m_events[i - 1]->getType() == ParamEvent::SetTarget) || | 648 if (i > 0 && |
| 645 (m_events[i - 1]->getType() == ParamEvent::SetValueCurve))) { | 649 ((m_events[i - 1]->getType() == ParamEvent::SetTarget) || |
| 650 (m_events[i - 1]->getType() == ParamEvent::SetValueCurve))) { |
| 646 cancelledEventIndex = i - 1; | 651 cancelledEventIndex = i - 1; |
| 647 } else if (i >= m_events.size()) { | 652 } else if (i >= m_events.size()) { |
| 648 // If there were no events occurring after |cancelTime| (and the | 653 // If there were no events occurring after |cancelTime| (and the |
| 649 // previous event is not SetTarget or SetValueCurve, we're done. | 654 // previous event is not SetTarget or SetValueCurve, we're done. |
| 650 return; | 655 return; |
| 651 } | 656 } |
| 652 | 657 |
| 653 // cancelledEvent is the event that is being cancelled. | 658 // cancelledEvent is the event that is being cancelled. |
| 654 ParamEvent* cancelledEvent = m_events[cancelledEventIndex].get(); | 659 ParamEvent* cancelledEvent = m_events[cancelledEventIndex].get(); |
| 655 ParamEvent::Type eventType = cancelledEvent->getType(); | 660 ParamEvent::Type eventType = cancelledEvent->getType(); |
| (...skipping 718 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1374 // | 1379 // |
| 1375 // v((c+k)/F) = V*m^k | 1380 // v((c+k)/F) = V*m^k |
| 1376 // | 1381 // |
| 1377 // where | 1382 // where |
| 1378 // V = v1*(v2/v1)^((c/F-t1)/(t2-t1)) | 1383 // V = v1*(v2/v1)^((c/F-t1)/(t2-t1)) |
| 1379 // m = (v2/v1)^(1/(F*(t2-t1))) | 1384 // m = (v2/v1)^(1/(F*(t2-t1))) |
| 1380 | 1385 |
| 1381 // Compute the per-sample multiplier. | 1386 // Compute the per-sample multiplier. |
| 1382 float multiplier = powf(value2 / value1, 1 / numSampleFrames); | 1387 float multiplier = powf(value2 / value1, 1 / numSampleFrames); |
| 1383 // Set the starting value of the exponential ramp. | 1388 // Set the starting value of the exponential ramp. |
| 1384 value = value1 * powf(value2 / value1, | 1389 value = |
| 1385 (currentFrame / sampleRate - time1) / deltaTime); | 1390 value1 * |
| 1391 powf(value2 / value1, (currentFrame / sampleRate - time1) / deltaTime); |
| 1386 | 1392 |
| 1387 for (; writeIndex < fillToFrame; ++writeIndex) { | 1393 for (; writeIndex < fillToFrame; ++writeIndex) { |
| 1388 values[writeIndex] = value; | 1394 values[writeIndex] = value; |
| 1389 value *= multiplier; | 1395 value *= multiplier; |
| 1390 ++currentFrame; | 1396 ++currentFrame; |
| 1391 } | 1397 } |
| 1392 // |value| got updated one extra time in the above loop. Restore it to | 1398 // |value| got updated one extra time in the above loop. Restore it to |
| 1393 // the last computed value. | 1399 // the last computed value. |
| 1394 if (writeIndex >= 1) | 1400 if (writeIndex >= 1) |
| 1395 value /= multiplier; | 1401 value /= multiplier; |
| (...skipping 348 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1744 unsigned writeIndex) { | 1750 unsigned writeIndex) { |
| 1745 size_t index = writeIndex; | 1751 size_t index = writeIndex; |
| 1746 | 1752 |
| 1747 for (; index < endFrame; ++index) | 1753 for (; index < endFrame; ++index) |
| 1748 values[index] = defaultValue; | 1754 values[index] = defaultValue; |
| 1749 | 1755 |
| 1750 return index; | 1756 return index; |
| 1751 } | 1757 } |
| 1752 | 1758 |
| 1753 } // namespace blink | 1759 } // namespace blink |
| OLD | NEW |