Giter Site home page Giter Site logo

sbooth / sfbaudioengine Goto Github PK

View Code? Open in Web Editor NEW
539.0 28.0 84.0 318.07 MB

A toolbox of powerful audio functionality for macOS and iOS

Home Page: https://sbooth.github.io/SFBAudioEngine/

License: MIT License

Objective-C++ 44.17% Objective-C 50.68% C 0.04% Swift 4.37% Shell 0.07% Makefile 0.47% C++ 0.21%
audio audio-player coreaudio avaudioengine macos ios objective-c swift audio-decoders audio-encoders dsd

sfbaudioengine's Introduction

SFBAudioEngine

SFBAudioEngine is a toolbox of powerful audio functionality for both macOS and iOS. SFBAudioEngine supports:

SFBAudioEngine is usable from both Swift and Objective-C.

Format Support

SFBAudioEngine supports most audio formats. In addition to all formats supported by Core Audio SFBAudioEngine supports:

FLAC, Ogg Opus, and MP3 are natively supported by Core Audio, however SFBAudioEngine provides its own encoders and decoders for these formats.

Quick Start

Playback

Playing an audio file is as simple as:

import SFBAudioEngine
let player = AudioPlayer()
let url = URL(fileURLWithPath: "example.flac")
try? player.play(url)

Note

Only file URLs are supported.

Metadata

Reading audio properties and metadata is similarly trivial:

if let audioFile = try? AudioFile(readingPropertiesAndMetadataFrom: url) {
    let sampleRate = audioFile.properties.sampleRate
    let title = audioFile.metadata.title
}

Conversion

Want to convert a WAVE file to FLAC?

let inputURL = URL(fileURLWithPath: "music.wav")
let outputURL = URL(fileURLWithPath: "music.flac")
try AudioConverter.convert(inputURL, to: outputURL)

The output file's format is inferred from the file extension.

More complex conversions are supported including writing to Data instead of files:

let output = OutputSource.makeForData()
let encoder = try AudioEncoder(outputSource: output, encoderName: .coreAudio)
encoder.settings = [
    .coreAudioFileTypeID: kAudioFileM4AType,
    .coreAudioFormatID: kAudioFormatMPEG4AAC,
    .coreAudioAudioConverterPropertySettings: [kAudioConverterCodecQuality: kAudioConverterQuality_High]
]
try AudioConverter.convert(inputURL, using: encoder)
// Encoder output is in `output.data`

Requirements

macOS 10.15+ or iOS 14.0+

Building SFBAudioEngine

  1. git clone https://github.com/sbooth/SFBAudioEngine.git --recurse-submodules
  2. cd SFBAudioEngine
  3. make -C XCFrameworks

The project file contains targets for macOS and iOS frameworks. The frameworks are signed to run locally by default. If you are using the hardened runtime you will need to select a team for signing.

The included Makefile may also be used to create the build products:

Target make Command
macOS Framework make build/macOS.xcarchive
macOS Catalyst Framework make build/macOS-Catalyst.xcarchive
iOS Framework make build/iOS.xcarchive
iOS Simulator Framework make build/iOS-Simulator.xcarchive
XCFramework make

macOS Framework Notes

When compiling macOS targets against SFBAudioEngine it is only necessary to link and embed SFBAudioEngine.framework. macOS supports umbrella frameworks so the libraries used by SFBAudioEngine are contained within SFBAudioEngine.framework.

iOS Framework Notes

When compiling iOS targets against SFBAudioEngine it is necessary not only to link to and embed SFBAudioEngine.framework, but the XCFrameworks used by SFBAudioEngine as well since iOS does not support umbrella frameworks.

Decoding

Audio decoders in SFBAudioEngine are broadly divided into two categories, those producing PCM output and those producing DSD output. Audio decoders read data from an SFBInputSource which may refer to a file, buffer, or network source.

All audio decoders in SFBAudioEngine implement the SFBAudioDecoding protocol. PCM-producing decoders additionally implement SFBPCMDecoding while DSD decoders implement SFBDSDDecoding.

Three special decoder subclasses that wrap an underlying audio decoder instance are also provided: SFBLoopableRegionDecoder, SFBDoPDecoder, and SFBDSDPCMDecoder. For seekable inputs, SFBLoopableRegionDecoder allows arbitrary looping and repeating of a specified PCM decoder segment. SFBDoPDecoder and SFBDSDPCMDecoder wrap a DSD decoder providing DSD over PCM (DoP) and PCM output respectively.

Playback

SFBAudioPlayerNode is a subclass of AVAudioSourceNode that provides rich playback functionality within an AVAudioEngine processing graph. SFBAudioPlayerNode supports gapless playback and comprehensive status notifications through delegate callbacks.

SFBAudioPlayer wraps an AVAudioEngine processing graph driven by SFBAudioPlayerNode. SFBAudioPlayer provides complete player functionality with no required configuration but also allows customization of the underlying processing graph as well as rich status notifications through delegate callbacks.

Encoding

Audio encoders in SFBAudioEngine process input data and convert it to their output format. Audio encoders write data to an SFBOutputSource which may refer to a file, buffer, or memory source.

All audio encoders in SFBAudioEngine implement the SFBAudioEncoding protocol. PCM-consuming encoders additionally implement SFBPCMEncoding. Currently there are no encoders consuming DSD in SFBAudioEngine.

Encoders don't support arbitrary input formats. The processing format used by an encoder is derived from a desired format combined with the encoder's settings.

Conversion

SFBAudioConverter supports high level conversion operations. An audio converter reads PCM audio from an audio decoder in the decoder's processing format, converts that audio to an intermediate PCM format, and then writes the intermediate PCM audio to an audio encoder which performs the final conversion to the desired format.

The decoder's processing format and the intermediate format must both be PCM but do not have to have the same sample rate, bit depth, channel count, or channel layout.

Properties and Metadata

Audio properties and metadata are accessed via instances of SFBAudioFile. Audio properties are read-only while metadata is writable for most formats. Audio metadata may be obtained from an instance of SFBAudioFile or instantiated directly.

Sample Audio Players

Two versions of SimplePlayer, one for macOS and one for iOS, are provided to illustrate the usage of SFBAudioEngine.

macOS

Image of an audio player window

SimplePlayer for macOS is written in Swift using AppKit and supports gapless sequential playback of items from a playlist. The essential functionality is contained in one file, PlayerWindowController.swift.

iOS

Image of audio file playback progress

SimplePlayer for iOS is written in Swift using SwiftUI and supports playback of a single item selected from a list.

License

SFBAudioEngine is released under the MIT License.

The open-source projects providing support for the various audio formats are subject to their own licenses that are compatible with the MIT license when used with SFBAudioEngine's default build configuration. For information on the specific licenses for each project see the README in the project's folder in XCFrameworks.

LGPL Notes

In order to maintain compatibility with the LGPL used by libsndfile, mpg123, libtta-cpp, lame, and the Musepack encoder dynamic linking is required.

sfbaudioengine's People

Contributors

antebarac avatar bsneed avatar chbeer avatar dependabot[bot] avatar mathbunnyru avatar sbooth avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

sfbaudioengine's Issues

How to play a HTTP-based audio file?

SFBAudioEngine has HTTPInputSource, which seems can be used to play a HTTP-based audio file. I try to use the following code to play a audio file located in HTTP server:

NSURL *urlInput = [NSURL URLWithString:@"http://218.19.141.173/test.mp3"];
HTTPInputSource *is= new HTTPInputSource(reinterpret_cast<CFURLRef>(urlInput));
NSError *error;
bool r=is->Open();
NSString *mime = @"audio/mp3";
if(!r)
    NSLog(@"open error");
AudioDecoder *decoder = AudioDecoder::CreateDecoderForInputSource(is,reinterpret_cast<CFStringRef>(mime));
if(nullptr == decoder)
    return NO;

player->Stop();

// Register for rendering started/finished notifications so the UI can be updated properly
decoder->SetDecodingStartedCallback(decodingStarted, self);
decoder->SetRenderingStartedCallback(renderingStarted, self);
decoder->SetRenderingFinishedCallback(renderingFinished, self);

if(!decoder->Open()) {
    delete decoder;
    return NO;
}
if(!player->Enqueue(decoder)){
    delete decoder;
    return NO;        
}

when running in simulator, the following error occurs:

Oct 15 20:18:21 pantekiMacBook-Pro.local Flacplayer_simple[420] : AudioUnitSetProperty (19, kAudioUnitScope_Input) failed: -10851
Oct 15 20:18:21 pantekiMacBook-Pro.local Flacplayer_simple[420] : Decoding starting for "http://218.19.141.173/test.mp3"
Oct 15 20:18:21 pantekiMacBook-Pro.local Flacplayer_simple[420] : Decoder format: 2 ch, 44100 Hz, 'lpcm' (0x00000029) 32-bit little-endian float, deinterleaved
Oct 15 20:18:21 pantekiMacBook-Pro.local Flacplayer_simple[420] : Decoder channel layout: (null)
Oct 15 20:18:21 pantekiMacBook-Pro.local Flacplayer_simple[420] : StartOutput
Oct 15 20:18:21 pantekiMacBook-Pro.local Flacplayer_simple[420] : ExtAudioFileRead failed: -50
Oct 15 20:18:21 pantekiMacBook-Pro.local Flacplayer_simple[420] : AudioConverterFillComplexBuffer failed: 1768846202
Oct 15 20:18:21 pantekiMacBook-Pro.local Flacplayer_simple[420] : Insufficient audio in ring buffer: 47 frames available, 512 requested
Oct 15 20:18:22 pantekiMacBook-Pro.local Flacplayer_simple[420] : ExtAudioFileRead failed: -50
Oct 15 20:18:22 pantekiMacBook-Pro.local Flacplayer_simple[420] : ExtAudioFileRead failed: -50
Oct 15 20:18:22 pantekiMacBook-Pro.local Flacplayer_simple[420] : Decoding finished for "http://218.19.141.173/test.mp3"
Oct 15 20:18:22 pantekiMacBook-Pro.local Flacplayer_simple[420] : StopOutput

maybe I miss something in my code ? How to play HTTP-based audio file,such as http://xxx.xxx.xxx.xxx/myaudio.flac by using SFBAudioEngine?

[Metadata] Cover artwork retrieval issue

As of one of the recent commits (I'm not too sure exactly which one, but I would guess that it's this one: 69484f2), artwork retrieval isn't working properly. It works partially, but it only retrieves the artwork for about 20% of files that worked fine in an earlier version of SFBAudioEngine. If there's any data or audio files or anything you need, let me know.

When I want to build it into my iPad , it turned out "duplicate errors"

Hello, I want to build it into my device and test the playback function. And then it turned out lots of duplicate errors.As follow:

duplicate symbol ___sputc in:
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(bitreader.o)
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(bitwriter.o)
duplicate symbol ___sputc in:
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(bitreader.o)
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(cpu.o)
duplicate symbol ___sputc in:
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(bitreader.o)
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(format.o)
duplicate symbol ___inline_isfinited in:
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(fixed.o)
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(lpc.o)
duplicate symbol ___inline_isfinitef in:
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(fixed.o)
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(lpc.o)
duplicate symbol ___inline_isfinitel in:
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(fixed.o)
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(lpc.o)
duplicate symbol ___inline_isinfd in:
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(fixed.o)
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(lpc.o)
duplicate symbol ___inline_isinff in:
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(fixed.o)
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(lpc.o)
duplicate symbol ___inline_isinfl in:
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(fixed.o)
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(lpc.o)
duplicate symbol ___inline_isnand in:
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(fixed.o)
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(lpc.o)
duplicate symbol ___inline_isnanf in:
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(fixed.o)
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(lpc.o)
duplicate symbol ___inline_isnanl in:
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(fixed.o)
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(lpc.o)
duplicate symbol ___inline_isnormald in:
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(fixed.o)
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(lpc.o)
duplicate symbol ___inline_isnormalf in:
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(fixed.o)
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(lpc.o)
duplicate symbol ___inline_isnormall in:
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(fixed.o)
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(lpc.o)
duplicate symbol ___inline_signbitd in:
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(fixed.o)
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(lpc.o)
duplicate symbol ___inline_signbitf in:
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(fixed.o)
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(lpc.o)
duplicate symbol ___inline_signbitl in:
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(fixed.o)
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(lpc.o)
duplicate symbol ___sincos in:
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(fixed.o)
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(lpc.o)
duplicate symbol ___sincosf in:
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(fixed.o)
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(lpc.o)
duplicate symbol ___sincospi in:
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(fixed.o)
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(lpc.o)
duplicate symbol ___sincospif in:
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(fixed.o)
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(lpc.o)
duplicate symbol ___sputc in:
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(bitreader.o)
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(metadata_iterators.o)
duplicate symbol ___sputc in:
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(bitreader.o)
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(stream_decoder.o)
duplicate symbol ___sputc in:
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(bitreader.o)
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(stream_encoder.o)
duplicate symbol ___sputc in:
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(bitreader.o)
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(stream_encoder_framing.o)
duplicate symbol ___inline_isfinited in:
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(fixed.o)
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(window.o)
duplicate symbol ___inline_isfinitef in:
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(fixed.o)
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(window.o)
duplicate symbol ___inline_isfinitel in:
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(fixed.o)
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(window.o)
duplicate symbol ___inline_isinfd in:
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(fixed.o)
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(window.o)
duplicate symbol ___inline_isinff in:
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(fixed.o)
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(window.o)
duplicate symbol ___inline_isinfl in:
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(fixed.o)
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(window.o)
duplicate symbol ___inline_isnand in:
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(fixed.o)
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(window.o)
duplicate symbol ___inline_isnanf in:
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(fixed.o)
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(window.o)
duplicate symbol ___inline_isnanl in:
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(fixed.o)
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(window.o)
duplicate symbol ___inline_isnormald in:
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(fixed.o)
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(window.o)
duplicate symbol ___inline_isnormalf in:
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(fixed.o)
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(window.o)
duplicate symbol ___inline_isnormall in:
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(fixed.o)
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(window.o)
duplicate symbol ___inline_signbitd in:
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(fixed.o)
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(window.o)
duplicate symbol ___inline_signbitf in:
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(fixed.o)
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(window.o)
duplicate symbol ___inline_signbitl in:
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(fixed.o)
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(window.o)
duplicate symbol ___sincos in:
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(fixed.o)
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(window.o)
duplicate symbol ___sincosf in:
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(fixed.o)
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(window.o)
duplicate symbol ___sincospi in:
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(fixed.o)
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(window.o)
duplicate symbol ___sincospif in:
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(fixed.o)
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(window.o)
duplicate symbol ___sputc in:
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(bitreader.o)
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(ogg_decoder_aspect.o)
duplicate symbol ___sputc in:
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(bitreader.o)
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(ogg_encoder_aspect.o)
duplicate symbol ___sputc in:
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(bitreader.o)
/Users/dzy/Library/Developer/Xcode/DerivedData/SFBAudioEngine-iOS-bdwyhfsekpyhdebhoafikbujogyp/Build/Intermediates/ArchiveIntermediates/SimplePlayer-iOS/BuildProductsPath/Release-iphoneos/libSFBAudioEngine.a(ogg_helper.o)
ld: 48 duplicate symbols for architecture armv7
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Rendering finished block sometimes does not fire

In the following demo project, I have the audio player set up in a fashion similar to that seen in SimplePlayer. With this setup, the block set by SetRenderingFinishedBlock will sometimes fail to fire while playback continues without issue.

In my tests, this almost always occurs after playing through the second queued song. The method of queueing (all at once or progressive) does not seem to make a difference.

Demo project: http://cl.ly/1k3f3x0Q0P3z

libsndfile is included on iOS, but license information is missing

libsndfile is licensed with the LGPL license, which means that strictly speaking you can't include it even in an iOS app, and you certainly can't include it in any kind of closed-source iOS app.

there is no license text included in your lib that recognises or acknowledges this. this is problematic.

please clarify this to potential end-users.

Updating required frameworks

Hey Stephen, Im not able to build the project (the tta++ lib is missing for example). I tried to add it by myself but with no success. It also seems than some frameworks provided in the download tab are not up to date so project can't build correctly. Could you update the framework package ? Thanks a lot.

How to continuously play music when the device's screen is locked?

Hi,I can use SFBAudioEngine to play FLAC/APE music in iPhone ,but still have one problem to solve: when playing music,if the device's screen is locked, the music is stopped, when the screen is unlocked,the music can be resumed to play. I've added the UIBackgroundModes property(App plays audio) to the Info.plist file, the music can continue when the App goes to background(by press HOME key),but stopped when the screen is locked.
How to continuously play music when the iphone screen is locked? thanks!

WAVE metadata bug in TagLib

I have another metadata bug report and this one seems to be in the TagLib library. Here's the strack trace:

Process:         Sonora [35038]
Path:            /Applications/Sonora.app/Contents/MacOS/Sonora
Identifier:      com.iktm.Sonora
Version:         0.71 (0.71)
Code Type:       X86-64 (Native)
Parent Process:  launchd [188]

Date/Time:       2012-01-26 16:22:52.075 -0500
OS Version:      Mac OS X 10.7.2 (11C74)
Report Version:  9

Crashed Thread:  5  Dispatch queue: com.apple.root.default-priority

Exception Type:  EXC_ARITHMETIC (SIGFPE)
Exception Codes: EXC_I386_DIV (divide by zero)

Application Specific Information:
objc[35038]: garbage collection is OFF

......

Thread 5 Crashed:: Dispatch queue: com.apple.root.default-priority
0   org.kde.taglib                  0x000000010bd22bea TagLib::RIFF::WAV::Properties::read(TagLib::ByteVector const&) + 362
1   org.kde.taglib                  0x000000010bd22cb2 TagLib::RIFF::WAV::Properties::Properties(TagLib::ByteVector const&, unsigned int, TagLib::AudioProperties::ReadStyle) + 92
2   org.kde.taglib                  0x000000010bd2273d TagLib::RIFF::WAV::File::read(bool, TagLib::AudioProperties::ReadStyle) + 675
3   org.kde.taglib                  0x000000010bd22848 TagLib::RIFF::WAV::File::File(TagLib::IOStream*, bool, TagLib::AudioProperties::ReadStyle) + 116
4   org.sbooth.AudioEngine          0x000000010b8fae5f WAVEMetadata::ReadMetadata(__CFError**) + 153
5   org.sbooth.AudioEngine          0x000000010b8f3678 AudioMetadata::CreateMetadataForURL(__CFURL const*, __CFError**) + 754

And the offending file: http://dl.dropbox.com/u/65903/samplewav.wav. I'm using the TagLib build that's in the Frameworks.zip in SFBAudioEngine's downloads.

mp4v2 library crash

Crash log:

Thread 2 Crashed:: Dispatch queue: com.apple.root.default-priority
0   com.google.code.mp4v2           0x00000001049fb21d mp4v2::impl::itmf::Tags::fetchString(std::map<std::string, MP4ItmfItem_s*, std::less<std::string>, std::allocator<std::pair<std::string const, MP4ItmfItem_s*> > > const&, std::string const&, std::string&, char const*&) + 77
1   com.google.code.mp4v2           0x00000001049fac81 mp4v2::impl::itmf::Tags::c_fetch(MP4Tags_s*&, void*) + 1313
2   com.google.code.mp4v2           0x00000001049f0866 MP4TagsFetch + 53
3   org.sbooth.AudioEngine          0x00000001047600f7 MP4Metadata::ReadMetadata(__CFError**) + 4711
4   org.sbooth.AudioEngine          0x0000000104753d74 AudioMetadata::CreateMetadataForURL(__CFURL const*, __CFError**) + 1476

This isn't an issue with SFBAudioEngine and I'm fairly certain that its the result of a corrupted audio file, but is there any way to make this fail cleanly without crashing?

Error running SFBAudioEngine on iPhone simulator

I am trying to add this project in new ios project . I have copied all the files in new project which are required for ios application ,
But static library libSFAudioEngine.a is not being copied in new project and I am having errors for iphone simulator but it has successfully build for iphone device.

I am having this warning

ld: warning: ignoring file /Users/Documents/ios5 Examples/FlacPlayerUniversal/opt/iphone-4.3/lib/libFLAC++.a, missing required architecture i386 in file

I have searched some post related to this error but my issue is not resolved . This error is coming when I am building project for iphone simulator and for device, it is not giving error.

I checked framework header path , header search path .Don't know how to solve this

TrueAudioDecoder Compilation issues

I'm trying to compile the latest version of SFBAudioEngine from master with the new set of Frameworks uploaded a few days ago, and I get a few compilation errors in TrueAudioDecoder.cpp for undeclared functions here (lines 174 to 178):

tta_decoder_new((TTA_io_callback *)&callbacks);
    if(0 != tta_decoder_init_get_info(&mStreamInfo)) {
        tta_decoder_done();
        return false;
    }

Having errors in compiling this project

Hello,

I added frameworks for mac os and it build successfully but when I run app it crashes and gives

dyld: Library not loaded: @rpath/dumb.framework/Versions/A/dumb
Referenced from: /Users/Library/Developer/Xcode/DerivedData/SFBAudioEngine-frrtbwxsqekjtmekpdfikqaqcsso/Build/Products/Debug/SimplePlayer.app/Contents/MacOS/SimplePlayer
Reason: image not found

And When I am trying to make build for ios app It is giving error

Command /Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/libtool failed with exit code 1

Please help me to run this app .

The audio frameworks for arm64

Hello ,
Could you teach me how to build the audio frameworks in this project ? Just one example.
Thank you very much.

Insufficient audio in ring buffer

After continuously playing several audio files(all wav files), the decoder stopped and the following info displayed in console:
: Insufficient audio in ring buffer: 488 frames available, 1024 requested

I find the ring buffer setup in audio player.cpp:

define RING_BUFFER_CAPACITY_FRAMES 16384

define RING_BUFFER_WRITE_CHUNK_SIZE_FRAMES 2048

define DECODER_THREAD_IMPORTANCE 6

can I adjust some parameter of these to fix the problem? or may be I should do some clean up before each:
player->Play(url);

Thanks

Error running SFBAudioEngine on iPhone

Hello ,
I have issue in running this application on iphone device . It is working fine for iphone simulator but crashing on iphone 4.3 os .
I added flac file in application's resources and it is crashing at below code in AudioPlayer.cpp

/ Store the decoded audio
if(0 != framesDecoded) {

LOGGER_INFO("com.widevision.Test", "Frames->>>>" <<mFramesDecoded);
CARingBufferError result = mRingBuffer->Store(bufferList, framesDecoded, startingFrameNumber + startTime);
if(kCARingBufferError_OK != result)
LOGGER_ERR("com.wv.Test", "CARingBuffer::Store failed: " << result);

                        LOGGER_INFO("", "Frames--------" <<mFramesDecoded);
                        OSAtomicAdd64Barrier(framesDecoded, &mFramesDecoded);
                   }

And Here is the crash log

Feb 6 14:54:39 iPhone SimplePlayer-iOS[1852] : OpenOutput
Feb 6 14:54:40 iPhone SimplePlayer-iOS[1852] : Resetting output
Feb 6 14:54:40 iPhone SimplePlayer-iOS[1852] : Enqueuing "file://localhost/var/mobile/Applications/DC638145-12AC-47CD-8727-BCDA8AA91086/SimplePlayer-iOS.app/Track.flac"
Feb 6 14:54:40 iPhone SimplePlayer-iOS[1852] : AudioUnitSetProperty (19, kAudioUnitScope_Input) failed: -10851
Feb 6 14:54:42 iPhone SimplePlayer-iOS[1852] : Decoding starting for "file://localhost/var/mobile/Applications/DC638145-12AC-47CD-8727-BCDA8AA91086/SimplePlayer-iOS.app/Track.flac"
Feb 6 14:54:42 iPhone SimplePlayer-iOS[1852] : Decoder format: 2 ch, 44100 Hz, 'lpcm' (0x0000002c) 16-bit little-endian signed integer, deinterleaved
Feb 6 14:54:42 iPhone SimplePlayer-iOS[1852] : Decoder channel layout: kAudioChannelLayoutTag_Stereo (0x00650002)
Feb 6 14:54:42 iPhone SimplePlayer-iOS[1852] : StartOutput
Feb 6 14:54:42 iPhone SimplePlayer-iOS[1852] : Frames->>>>0
Feb 6 14:54:42 iPhone SimplePlayer-iOS[1852] : Frames--------0

Printing Frames -- >> 0

Help Please !!!

How to handle audio session interruption?

I'm using SFBAudioEngine in my iOS8 project, to handle audio session interruption(phone call), I use following codes in my ViewController's viewDidLoad method:

AVAudioSession *session = [AVAudioSession sharedInstance];
NSError *err = nil;
[session setCategory:AVAudioSessionCategoryPlayback error:&err];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(interruptHandler:) name:AVAudioSessionInterruptionNotification object:self];
[session setActive:YES error:&err];
......

and the interruption handler:

- (void) interruptHandler:(NSNotification *)notif
{
    NSLog(@"interruptHandler");
    //Check to see if it was a Begin interruption
    if ([[notif.userInfo valueForKey:AVAudioSessionInterruptionTypeKey] isEqualToNumber:[NSNumber numberWithInt:AVAudioSessionInterruptionTypeBegan]]) {
        NSLog(@"Interruption began!");
        [self playPause:self];

    } else if([[notif.userInfo valueForKey:AVAudioSessionInterruptionTypeKey] isEqualToNumber:[NSNumber numberWithInt:AVAudioSessionInterruptionTypeEnded]]){
        NSLog(@"Interruption ended!");
        //Resume your audio
        [self playPause:self];

    }   
}

but when a phone call is coming, interruptHandler never get called. Any idea?

Problems compiling

Hi,

I'm trying to compile the SFBAudioEngine framework for Mac, but it fails with these errors:

SFBAudioEngine/Metadata/MP4Metadata.cpp: In function 'void DisableMP4v2Logging()':
SFBAudioEngine/Metadata/MP4Metadata.cpp:44: error: 'MP4_LOG_NONE' was not declared in this scope
SFBAudioEngine/Metadata/MP4Metadata.cpp:44: error: 'MP4LogSetLevel' was not declared in this scope

And a million of these:

In file included from /usr/include/c++/4.2.1/istream:845,
from /usr/include/c++/4.2.1/sstream:44,
from /Users/nightition/Development/other/SFBAudioEngine/Logger.h:34,
from /Users/nightition/Development/other/SFBAudioEngine/Decoders/MonkeysAudioDecoder.cpp:41:
/usr/include/c++/4.2.1/bits/istream.tcc:123:35: error: macro "min" requires 2 arguments, but only 1 given
/usr/include/c++/4.2.1/bits/istream.tcc:124:45: error: macro "max" requires 2 arguments, but only 1 given
/usr/include/c++/4.2.1/bits/istream.tcc:143:33: error: macro "min" requires 2 arguments, but only 1 given
/usr/include/c++/4.2.1/bits/istream.tcc:144:43: error: macro "max" requires 2 arguments, but only 1 given
/usr/include/c++/4.2.1/bits/istream.tcc:438:48: error: macro "max" requires 2 arguments, but only 1 given
/usr/include/c++/4.2.1/bits/istream.tcc:441:53: error: macro "min" requires 2 arguments, but only 1 given
/usr/include/c++/4.2.1/bits/istream.tcc:449:47: error: macro "max" requires 2 arguments, but only 1 given
/usr/include/c++/4.2.1/bits/istream.tcc:489:48: error: macro "max" requires 2 arguments, but only 1 given
/usr/include/c++/4.2.1/bits/istream.tcc:493:53: error: macro "min" requires 2 arguments, but only 1 given
/usr/include/c++/4.2.1/bits/istream.tcc:501:47: error: macro "max" requires 2 arguments, but only 1 given
/usr/include/c++/4.2.1/bits/istream.tcc:507:53: error: macro "max" requires 2 arguments, but only 1 given
/usr/include/c++/4.2.1/bits/istream.tcc:806:43: error: macro "max" requires 2 arguments, but only 1 given

I first compiled all of the required frameworks myself and then realized you uploaded an archive :) It didn't help with the MP4 errors, and of course neither did it help for the template-related ones.

I'm using Xcode 4.2 on Lion. Changing between LLVM GCC 4.2 and LLVM 3.0 didn't help.

Any ideas?

Thanks,
Ivan

DSFDecoder failed to decode .dsf file

when I play a .dsf audio file downloaded from
http://samplerateconverter.com/content/free-samples-dsf-audio-files

  • (IBAction) playTestTrack:(id)sender
    {
    if(![self playURL:[[NSBundle mainBundle] URLForResource:@"test" withExtension:@"dsf"]])
    LOGGER_ERR("org.sbooth.SimplePlayer-iOS", "Could not play");
    }

the following message displayed in console and the audio file could not be played:

: Format not supported: 2 ch, 2.8224e+06 Hz, 'DSD ' (0x00000020) 1 bits/channel, 1 bytes/packet, 8 frames/packet, 0 bytes/frame
May 23 00:28:53 pzsip6p SimplePlayer-iOS[607] : Could not play

does DSFDecoder require some specified format DSF audio file?
thanks!

How to compile lib for iOS

Could you tell me how to compile lib for iOS.I had already get the SFBAudioEngine.framework for MacOS . And I had work hard on compile lib for iOS.When I set Scheme for the libSFBAudioEngine , I got the error messgae
"Command /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/libtool failed with exit code 1".

EXC_BAD_ACCESS in TagLib (related to AttachedPicture?)

I recently updated my build of SFBAudioEngine (which was a few months old) to the most recent build from master, that uses AttachedPicture to retrieve artwork. It works fine for the most part, but the app seems to randomly crash every now and then while reading metadata with the following trace:

Crashed Thread:  0  Dispatch queue: com.apple.main-thread

Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x0000000000000000

VM Regions Near 0:
--> 
    __TEXT                 0000000109063000-0000000109179000 [ 1112K] r-x/rwx SM=COW  /Users/USER/*/Sonora.app/Contents/MacOS/Sonora

Application Specific Information:
objc[6881]: garbage collection is OFF

Thread 0 Crashed:: Dispatch queue: com.apple.main-thread
0   org.sbooth.AudioEngine          0x00000001092d10f8 std::__1::__tree<std::__1::pair<TagLib::ByteVector, TagLib::List<TagLib::ID3v2::Frame*> >, std::__1::__map_value_compare<TagLib::ByteVector, TagLib::List<TagLib::ID3v2::Frame*>, std::__1::less<TagLib::ByteVector>, true>, std::__1::allocator<std::__1::pair<TagLib::ByteVector, TagLib::List<TagLib::ID3v2::Frame*> > > >::__insert_node_at(std::__1::__tree_node_base<void*>*, std::__1::__tree_node_base<void*>*&, std::__1::__tree_node_base<void*>*) + 88 (__tree:1698)
1   org.sbooth.AudioEngine          0x00000001092cfefd std::__1::map<TagLib::ByteVector, TagLib::List<TagLib::ID3v2::Frame*>, std::__1::less<TagLib::ByteVector>, std::__1::allocator<std::__1::pair<TagLib::ByteVector const, TagLib::List<TagLib::ID3v2::Frame*> > > >::operator[](TagLib::ByteVector const&) + 205 (map:1276)
2   org.sbooth.AudioEngine          0x00000001092cc7d3 TagLib::Map<TagLib::ByteVector, TagLib::List<TagLib::ID3v2::Frame*> >::operator[](TagLib::ByteVector const&) const + 51 (tmap.tcc:160)
3   org.sbooth.AudioEngine          0x00000001092c9473 AddID3v2TagToDictionary(__CFDictionary*, std::__1::vector<AttachedPicture*, std::__1::allocator<AttachedPicture*> >&, TagLib::ID3v2::Tag const*) + 259 (AddID3v2TagToDictionary.cpp:55)
4   org.sbooth.AudioEngine          0x00000001092d60c4 MP3Metadata::ReadMetadata(__CFError**) + 1716 (MP3Metadata.cpp:166)
5   org.sbooth.AudioEngine          0x00000001092adac1 AudioMetadata::CreateMetadataForURL(__CFURL const*, __CFError**) + 1313 (AudioMetadata.cpp:372)

There's not much more information I have on this since it's not isolated to specific files, but let me know if there's anything else I can provide to help you resolve the issue.

using libSFBAudioEngine.a in objc app

Hi,

Thanks for making the SFBAudioEngine available.

I'm having a problem trying to use the libSFBAudioEngine.a library in an objc app. When I try to #import some of the headers such as Audiodecoder.h I get an "unknown type name 'class'; did you mean 'Class'?" error. Can this library be easily used within a pure objc app? Is there a way to get around this issue and add these objc++ headers to an objc project.

Thanks,

Jay

Musepack not updated in dependencies

As of 9b66b69 musepack was updated to r475 but it seems that this update to musepack was never reflected in the dependencies archive linked in the README. Trying to build right now results in mpc/mpcdec.h not being found.

Wiki or more detailed setup describtion

I am new to this library. I found some downloads, but especially the iOS downloads are very old. Are there any instructions to setup this library available? (I still not got it...)

Compile lib for iOS

Hi, I'm compiling lib for iOS, but not work.

Errors list
screen shot 2014-01-14 at 14 11 44

Can you help me, please?

Thanks!

AudioPlayer Stop() and SkipToNextTrack() broken?

This is something I had working before (a long time ago), but it seems to have broken in a recent commit. First of all, here's the code I'm using to enqueue songs:

- (BOOL)enqueueURL:(NSURL*)url
{
    AudioDecoder *decoder = AudioDecoder::CreateDecoderForURL((CFURLRef)url);
    if (decoder == NULL) { return NO; }
    decoder->SetRenderingStartedCallback(renderingStarted, self);
    decoder->SetRenderingFinishedCallback(renderingFinished, self);
    if ((_player->Enqueue(decoder)) == false) {
        NSLog(@"no decoder");
        delete decoder;
        return NO;
    }
    return YES;
}

I adapted it directly from the examples, so I think it should be alright. Here's the first problem scenario

  1. Enqueue song and call Play() ---> song plays fine
  2. User clicks the "next" button on my audio player
  3. Call Stop(), and then ClearQueuedDecoders()
  4. Enqueue the next song
  5. Call Play() ---> no audio but there are no errors either

Second problem scenario:

  1. Enqueue two songs and call Play() ---> first song starts playing
  2. User clicks the "next" button
  3. Call SkipToNextTrack() ---> second song should start playing, but nothing happens (no audio)

As mentioned earlier, this is code that worked fine before, so I'm guessing something must've broken recently.

Random exception in MP4Metadata.cpp

In my program I'm seeing exceptions seemingly thrown at random when creating metadata objects from files. As far as I can see there's nothing that ties the files that it throws on together and it occurs rarely enough that it only shows up when processing many files in sequence (typically it only appears when processing upwards of 500 songs, but occasionally this isn't true). The tag it always triggers on is kMusicBrainzReleaseIDKey, as seen below.

screen shot 2014-12-10 at 5 15 18 pm

I pulled and recompiled a fresh version of SFBAudioEngine and its dependencies yesterday and to the best of my knowledge, nothing is getting prematurely released in my own code, so I'm not sure what the problem could be.

memory leak

Hi Stephen,

I believe a memory leak is caused on occasion when calling Enqueue too fast. Here's an example:

- (void)skipToPreviousTrack
{
    BOOL wasPlaying = audioPlayer->IsPlaying();

    audioPlayer->Stop();
    audioPlayer->ClearQueuedDecoders();

    // enqueue something...

    if (wasPlaying)
        audioPlayer->Play();
}

The problem occurs when this code is tied to a button and a user spams it with clicks. Eventually memory grows and is never released. I ran this in Instruments to find out what's going on, and here's the jist of it:

Around line 2788 in AudioPlayer.cpp, it makes a call into the audio stack to get the maximum frame count it can use. On my system, this comes back as 16131408, which is huge. Shortly after, it sets maxFrames like so...

if(!SetPropertyOnAUGraphNodes(kAudioUnitProperty_MaximumFramesPerSlice, &newMaxFrames, sizeof(newMaxFrames))) {
                LOGGER_ERR("org.sbooth.AudioEngine.AudioPlayer", "SetPropertyOnAUGraphNodes (kAudioUnitProperty_MaximumFramesPerSlice) failed");
                return false;
            }

This then triggers a malloc in the audio unit as you can see here: http://d.pr/i/4Fu9 and here: http://d.pr/i/PZD7

Once these pile up or get backlogged, the memory never gets released and any subsequent calls to Enqueue begin to take progressively longer.

In my own copy, i've changed this so that instead of asking for the maximum, I simply set it to something reasonable (i picked 8192), and the problem is gone.

I think a proper fix would be:

UInt32 preferredFrameCount = 8192; // or something else..
... get the max from the AU ...

if (currentMaxFrames < preferredFrameCount)
preferredFrameCount = currentMaxFrames;

... set the preferredFrameCount instead of currentMaxFrames ...

This seems to be a decent solution, but there may be things going on that I don't fully grok. Lemme know what you think.

Thanks!

Brandon

How DoPDecoder works with ASIO to output to DAC?

I have a Sony PHA-3 DAC supporting DoP input, I know I can use DoPDecoder with ASIO output to produce DoP data and send them to PHA-3, but how DoPDecoder be used with ASIO ? Please help me, Thanks!

libc++abi.dylib: terminate called throwing an exception

Hello,

I just use SFBAudioEngine play Monkey's Audio with the particular files and libMACLib.a . When I ran in my iPad2 , it turns out an error like the title.And then I debug the code.

The following is the error code. Can you help me to solve this error ?
Thank you very much.

AudioUnitSetProperty (kAudioUnitProperty_MaximumFramesPerSlice, kAudioUnitScope_Global) failed: -10849

Files w/ differing sample rates muck up the queue

If I enqueue 3 files like so...

File 1, 44100k
File 2, 96000k
File 3, 44100k

It seems impossible to play through all 3 without writing a bunch of spaghetti code to make it work (and i haven't even managed to get that right). I can reproduce this in Decibel as well.

In both Decibel as well as my own app, the behavior is that things just stop playing after the first one finishes. I realize its not possible to do gapless playback on files w/ different sample rates due to the ring buffer needing to be recreated, but i can't seem to figure out how to work around it.

The only available hooks I have are the decoder hooks that notify me of decoding/rendering starting/stopping. Best I can tell, they aren't deterministic enough for me to be able to cobble together a solution or a workaround.

It would be nice to be able to do gapless playback when possible, yet continue to cycle through the items in the queue when its not. As with last time, I'll post any possible fix I might come up with once I have one that works.

MAS allows only read-only access to files

We submitted our app using SFBAudioEngine to the app store and got rejected because we were opening the files with read/write access instead of read-only. I poked around a bit and saw that you sent this pull request to the TagLib repo:

taglib/taglib#3

Are these changes included in the taglib.framework included in the Frameworks.zip file? And do the other frameworks used for reading metadata (e.g. mp4v2) open files as read/write or read-only? I think its strictly the metadata reading that's opening files as read/write. I thought it might've been audio playback as well, but I saw that FileInputSource already opens files as read-only so I don't think that could be it.

AudioDecoder problems under ARC

AudioDecoder's methods for setting callbacks uses a void* parameter for the context. This construct isn't supported under Objective-C ARC so it won't compile (I'm not talking about compiling SFBAudioEngine under ARC, just using AudioDecoder in my own ARC-compiled code).

How to play an audio file from the specified time?

I want to play an audio file from the specified time by:
_player->Play((__bridge CFURLRef)url);
_player->seekToTime(time);

but the audio always played from the very begining, but the following code works:
_player->Play((__bridge CFURLRef)url);
[NSNSThread sleepForTimeInterval:0.01];
_player->seekToTime(time);

It seems the seek operation should be fired when the audio begin to playing.
How to do this perfectly? thanks

SFBAudioEngine used in Swift project

I use SFBAudioEngine in my Swift project, since Swift can use C/C++ codes directly, I define a Objective C class wrapper for AudioPlayer:

#import <Foundation/Foundation.h>

@interface AudioPlayerWrapper : NSObject{
}
- (id) init;
- (void) playPause;
- (void) seekForward;
- (void) seekBackward;
- (BOOL) playURL:(NSURL *)url;
- (BOOL) isPlaying;
- (BOOL) isPaused;
- (BOOL) isStopped;
- (BOOL) stop;

@end

#import "AudioPlayerWrapper.h"
#include "AudioPlayer.h"
#include "AudioDecoder.h"
#include "Logger.h"

enum ePlayerFlags : unsigned int {
    ePlayerFlagRenderingStarted         = 1u << 0,
    ePlayerFlagRenderingFinished        = 1u << 1
};

@interface AudioPlayerWrapper(){
    SFB::Audio::Player  *_player;
    std::atomic_uint    _playerFlags;
}
@end

// AudioPlayerWrapper.m
@implementation AudioPlayerWrapper
- (id) init
{
    self = [super init];
    if (self){
        _player = new SFB::Audio::Player();
        // This will be called from the realtime rendering thread and as such MUST NOT BLOCK!!
        _player->SetRenderingStartedBlock(^(const SFB::Audio::Decoder& /*decoder*/){
            _playerFlags.fetch_or(ePlayerFlagRenderingStarted);
        });

        // This will be called from the realtime rendering thread and as such MUST NOT BLOCK!!
        _player->SetRenderingFinishedBlock(^(const SFB::Audio::Decoder& /*decoder*/){
            _playerFlags.fetch_or(ePlayerFlagRenderingFinished);
        });
        NSLog(@"player created");
        asl_add_log_file(nullptr, STDERR_FILENO);
        ::SFB::Logger::SetCurrentLevel(::SFB::Logger::debug);
    }
    return self;
}

- (void) playPause
{
    _player->PlayPause();
}

- (void) seekForward
{
    _player->SeekForward();
}

- (void) seekBackward
{
    _player->SeekBackward();
}

- (void) seek:(SInt64)position
{

    SInt64 totalFrames;
    if(_player->GetTotalFrames(totalFrames)) {
        SInt64 desiredFrame = (SInt64)(position * totalFrames);
        _player->SeekToFrame(desiredFrame);
    }
}

- (BOOL) playURL:(NSURL *)url
{
    if(nil == url)
        return NO;
    return _player->Play((__bridge CFURLRef)url);
}
.....

In Swift, play a flac audio file:
self.myAudioPlayer = AudioPlayerWrapper()
let audioFileURL = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("test", ofType: "flac")!)
self.myAudioPlayer!.playURL(audioFileURL)

the above code fail to play the flac file. I found the AudioDecoder is not created successfully:
2015-04-26 10 42 40

do I need to register the supported audio decoder(FLAC,APE,...) before playing?
thanks!

SFBAudioEngine doesn't switch sound output

Just got this bug report from a user, when SFBAudioEngine is playing audio and the user switches the sound output device from System Preferences, the audio engine doesn't switch to the new output and keeps playing on the old one. Creating a new audio player instance solves the issue, so it seems like its just failing to detect when the output device changes.

EXC_BAD_ACCESS in CARingBuffer.cpp

This is a random bug and is probably hard to track, but I thought I should let you know anyways. I'm randomly getting an EXC_BAD_ACCESS error on line 130 of CARingBuffer.cpp (inside FetchABL()). Here's a screenshot:

Xcode

This seems to happen most often when skipping through songs quickly (basically just calling SkipToNextTrack and enqueueing a new decoder).

Can't set numeric tags on AAC and ALAC files

When setting numerical tags such as track number, disc number, and BPM, set values are not held although the metadata object still registers as having unsaved changes. Nothing is printed in the debugger or anything, it just silently fails and the tags revert to their previous state.

This only happens with files using the extension .m4a, which includes AAC and Apple Lossless files. Non-numeric tags are unaffected and all tags can be set properly on MP3 files.

I am running Xcode 5 and OS X 10.9.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.