• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2010, Google Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1.  Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2.  Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
15  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
16  * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
17  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
18  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
19  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
20  * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
22  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23  */
24 
25 #include "config.h"
26 
27 #if ENABLE(WEB_AUDIO)
28 
29 #include "platform/audio/AudioFileReader.h"
30 
31 #include "platform/audio/AudioBus.h"
32 #include "public/platform/Platform.h"
33 #include "public/platform/WebAudioBus.h"
34 
35 namespace WebCore {
36 
decodeAudioFileData(const char * data,size_t size,double sampleRate)37 PassRefPtr<AudioBus> decodeAudioFileData(const char* data, size_t size, double sampleRate)
38 {
39     blink::WebAudioBus webAudioBus;
40     if (blink::Platform::current()->loadAudioResource(&webAudioBus, data, size, sampleRate))
41         return webAudioBus.release();
42     return 0;
43 }
44 
loadPlatformResource(const char * name,float sampleRate)45 PassRefPtr<AudioBus> AudioBus::loadPlatformResource(const char* name, float sampleRate)
46 {
47     const blink::WebData& resource = blink::Platform::current()->loadResource(name);
48     if (resource.isEmpty())
49         return 0;
50 
51     // FIXME: the sampleRate parameter is ignored. It should be removed from the API.
52     RefPtr<AudioBus> audioBus = decodeAudioFileData(resource.data(), resource.size(), sampleRate);
53 
54     if (!audioBus.get())
55         return 0;
56 
57     // If the bus is already at the requested sample-rate then return as is.
58     if (audioBus->sampleRate() == sampleRate)
59         return audioBus;
60 
61     return AudioBus::createBySampleRateConverting(audioBus.get(), false, sampleRate);
62 }
63 
createBusFromInMemoryAudioFile(const void * data,size_t dataSize,bool mixToMono,float sampleRate)64 PassRefPtr<AudioBus> createBusFromInMemoryAudioFile(const void* data, size_t dataSize, bool mixToMono, float sampleRate)
65 {
66     // FIXME: the sampleRate parameter is ignored. It should be removed from the API.
67     RefPtr<AudioBus> audioBus = decodeAudioFileData(static_cast<const char*>(data), dataSize, sampleRate);
68     if (!audioBus.get())
69         return 0;
70 
71     // If the bus needs no conversion then return as is.
72     if ((!mixToMono || audioBus->numberOfChannels() == 1) && audioBus->sampleRate() == sampleRate)
73         return audioBus;
74 
75     return AudioBus::createBySampleRateConverting(audioBus.get(), mixToMono, sampleRate);
76 }
77 
78 } // namespace WebCore
79 
80 #endif // ENABLE(WEB_AUDIO)
81