| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2010, Google Inc. All rights reserved. | 2 * Copyright (C) 2010, 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 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
| 8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
| 9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
| 10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
| (...skipping 386 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 397 } | 397 } |
| 398 | 398 |
| 399 void AudioBufferSourceNode::clampGrainParameters(const AudioBuffer* buffer) | 399 void AudioBufferSourceNode::clampGrainParameters(const AudioBuffer* buffer) |
| 400 { | 400 { |
| 401 ASSERT(buffer); | 401 ASSERT(buffer); |
| 402 | 402 |
| 403 // We have a buffer so we can clip the offset and duration to lie within the
buffer. | 403 // We have a buffer so we can clip the offset and duration to lie within the
buffer. |
| 404 double bufferDuration = buffer->duration(); | 404 double bufferDuration = buffer->duration(); |
| 405 | 405 |
| 406 m_grainOffset = clampTo(m_grainOffset, 0.0, bufferDuration); | 406 m_grainOffset = clampTo(m_grainOffset, 0.0, bufferDuration); |
| 407 m_grainDuration = clampTo(m_grainDuration, 0.0, bufferDuration - m_grainOffs
et); | 407 |
| 408 if (loop()) { |
| 409 // We're looping a grain with a grain duration specified. Schedule the l
oop to stop after |
| 410 // grainDuration seconds after starting, possibly running the loop multi
ple times if |
| 411 // grainDuration is larger than the buffer duration. The net effect is a
s if the user called |
| 412 // stop(when + grainDuration). |
| 413 m_grainDuration = clampTo(m_grainDuration, 0.0, std::numeric_limits<doub
le>::infinity()); |
| 414 m_endTime = m_startTime + m_grainDuration; |
| 415 } else { |
| 416 m_grainDuration = clampTo(m_grainDuration, 0.0, bufferDuration - m_grain
Offset); |
| 417 } |
| 408 | 418 |
| 409 // We call timeToSampleFrame here since at playbackRate == 1 we don't want t
o go through | 419 // We call timeToSampleFrame here since at playbackRate == 1 we don't want t
o go through |
| 410 // linear interpolation at a sub-sample position since it will degrade the q
uality. When | 420 // linear interpolation at a sub-sample position since it will degrade the q
uality. When |
| 411 // aligned to the sample-frame the playback will be identical to the PCM dat
a stored in the | 421 // aligned to the sample-frame the playback will be identical to the PCM dat
a stored in the |
| 412 // buffer. Since playbackRate == 1 is very common, it's worth considering qu
ality. | 422 // buffer. Since playbackRate == 1 is very common, it's worth considering qu
ality. |
| 413 m_virtualReadIndex = AudioUtilities::timeToSampleFrame(m_grainOffset, buffer
->sampleRate()); | 423 m_virtualReadIndex = AudioUtilities::timeToSampleFrame(m_grainOffset, buffer
->sampleRate()); |
| 414 } | 424 } |
| 415 | 425 |
| 416 void AudioBufferSourceNode::start(double when, ExceptionState& exceptionState) | 426 void AudioBufferSourceNode::start(double when, ExceptionState& exceptionState) |
| 417 { | 427 { |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 452 exceptionState.throwDOMException( | 462 exceptionState.throwDOMException( |
| 453 InvalidStateError, | 463 InvalidStateError, |
| 454 "Duration must be a finite non-negative number: " + String::number(g
rainDuration)); | 464 "Duration must be a finite non-negative number: " + String::number(g
rainDuration)); |
| 455 return; | 465 return; |
| 456 } | 466 } |
| 457 | 467 |
| 458 m_isGrain = true; | 468 m_isGrain = true; |
| 459 m_grainOffset = grainOffset; | 469 m_grainOffset = grainOffset; |
| 460 m_grainDuration = grainDuration; | 470 m_grainDuration = grainDuration; |
| 461 | 471 |
| 472 m_startTime = when; |
| 473 |
| 462 if (buffer()) | 474 if (buffer()) |
| 463 clampGrainParameters(buffer()); | 475 clampGrainParameters(buffer()); |
| 464 | 476 |
| 465 m_startTime = when; | |
| 466 m_playbackState = SCHEDULED_STATE; | 477 m_playbackState = SCHEDULED_STATE; |
| 467 } | 478 } |
| 468 | 479 |
| 469 double AudioBufferSourceNode::totalPitchRate() | 480 double AudioBufferSourceNode::totalPitchRate() |
| 470 { | 481 { |
| 471 double dopplerRate = 1.0; | 482 double dopplerRate = 1.0; |
| 472 if (m_pannerNode) | 483 if (m_pannerNode) |
| 473 dopplerRate = m_pannerNode->dopplerRate(); | 484 dopplerRate = m_pannerNode->dopplerRate(); |
| 474 | 485 |
| 475 // Incorporate buffer's sample-rate versus AudioContext's sample-rate. | 486 // Incorporate buffer's sample-rate versus AudioContext's sample-rate. |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 532 { | 543 { |
| 533 visitor->trace(m_buffer); | 544 visitor->trace(m_buffer); |
| 534 visitor->trace(m_playbackRate); | 545 visitor->trace(m_playbackRate); |
| 535 visitor->trace(m_pannerNode); | 546 visitor->trace(m_pannerNode); |
| 536 AudioScheduledSourceNode::trace(visitor); | 547 AudioScheduledSourceNode::trace(visitor); |
| 537 } | 548 } |
| 538 | 549 |
| 539 } // namespace blink | 550 } // namespace blink |
| 540 | 551 |
| 541 #endif // ENABLE(WEB_AUDIO) | 552 #endif // ENABLE(WEB_AUDIO) |
| OLD | NEW |