Research
Security News
Quasar RAT Disguised as an npm Package for Detecting Vulnerabilities in Ethereum Smart Contracts
Socket researchers uncover a malicious npm package posing as a tool for detecting vulnerabilities in Etherium smart contracts.
github.com/dimitris-c/AudioStreaming
An AudioPlayer/Streaming library for iOS written in Swift, allows playback of online audio streaming, local file as well as gapless queueing.
Under the hood AudioStreaming
uses AVAudioEngine
and CoreAudio
for playback and provides an easy way of applying real-time audio enhancements.
Known limitations:
Note: You need to keep a reference to the AudioPlayer
object
let player = AudioPlayer()
player.play(url: URL(string: "https://your-remote-url/to/audio-file.mp3")!)
let player = AudioPlayer()
player.play(url: URL(fileURLWithPath: "your-local-path/to/audio-file.mp3")!)
let player = AudioPlayer()
// when you want to queue a single url
player.queue(url: URL(string: "https://your-remote-url/to/audio-file.mp3")!)
// or if you want to queue a list of urls use
player.queue(urls: [
URL(fileURLWithPath: "your-local-path/to/audio-file.mp3")!,
URL(fileURLWithPath: "your-local-path/to/audio-file-2.mp3")!
])
let player = AudioPlayer()
player.play(url: URL(fileURLWithPath: "your-local-path/to/audio-file.mp3")!)
// adjust the playback rate
player.rate = 2.0
// adjusting the volume
player.volume = 0.5
// mute/unmute the audio
player.mute = true
// pause the playback
player.pause()
// resume the playback
player.resume()
// stop the playback
player.stop()
// seeking to to a time (in seconds)
player.seek(to: 10)
let player = AudioPlayer()
player.play(url: URL(fileURLWithPath: "your-local-path/to/audio-file.mp3")!)
// To get the audio file duration
let duration = player.duration
// To get the progress of the player
let progress = player.progress
// To get the state of the player, for possible values view the `AudioPlayerState` enum
let state = player.state
// To get the stop reason of the player, for possible values view the `AudioPlayerStopReason` enum
let state = player.stopReason
You can inspect various callbacks by using the delegate
property of the AudioPlayer
to get informed about the player state, errors etc.
View the AudioPlayerDelegate for more details
let player = AudioPlayer()
player.play(url: URL(fileURLWithPath: "your-local-path/to/audio-file.mp3")!)
player.delegate = self // an object conforming to AudioPlayerDelegate
// observing the audio player state, provides the new and previous state of the player.
func audioPlayerStateChanged(player: AudioPlayer, with newState: AudioPlayerState, previous: AudioPlayerState) {}
AudioStreaming
provides an easy way to attach/remove AVAudioNode
(s).
This provides a powerful way of adjusting the playback audio with various enhancements
let reverbNode = AVAudioUnitReverb()
reverbNode.wetDryMix = 50
let player = AudioPlayer()
// attach a single node
player.attach(node: reverbNode)
// detach a single node
player.detach(node: reverbNode)
// detach all custom added nodes
player.detachCustomAttachedNodes()
The example project shows an example of adding a custom AVAudioUnitEQ
node for adding equaliser to the AudioPlayer
AudioStreaming
allow for custom frame filters to be added so that recording or other observation for audio that's playing.
You add a frame filter by using the AudioPlayer
's property frameFiltering
.
let player = AudioPlayer()
let format = player.mainMixerNode.outputFormat(forBus: 0)
let settings = [
AVFormatIDKey: kAudioFormatMPEG4AAC,
AVSampleRateKey: format.sampleRate,
AVNumberOfChannelsKey: format.channelCount
] as [String : Any]
var audioFile = try? AVAudioFile(
forWriting: outputUrl,
settings: settings,
commonFormat: format.commonFormat,
interleaved: format.isInterleaved)
let record = FilterEntry(name: "record") { buffer, when in
try? audioFile?.write(from: buffer)
}
player.frameFiltering.add(entry: record)
See the FrameFiltering
protocol for more ways of adding and removing frame filters.
The callback in which you observe a filter will be run on a thread other than the main thread.
Under the hood the concrete class for frame filters, FrameFilterProcessor
installs a tap on the mainMixerNode
of AVAudioEngine
in which all the added filter will be called from.
Note since the mainMixerNode
is publicly exposed extra care should be taken to not install a tap directly and also use frame filters, this result in an exception because only one tap can be installed on an output node, as per Apple's documentation.
Cocoapods is a dependency manager for Cocoa projects. You can install it with the following command:
$ gem install cocoapods
To intergrate AudioStreaming with Cocoapods to your Xcode project add the following to your Podfile
:
pod 'AudioStreaming'
On Xcode 11.0+ you can add a new dependency by going to File / Swift Packages / Add Package Dependency... and enter package repository URL https://github.com/dimitris-c/AudioStreaming.git, then follow the instructions.
Carthage is a decentralized dependency manager that builds your dependencies and provides you with frameworks.
You can install Carthage with Homebrew using the following command:
$ brew update
$ brew install carthage
To integrate AudioStreaming into your Xcode project using Carthage, add the following to your Cartfile
:
github "dimitris-c/AudioStreaming"
Visit installation instructions on Carthage to install the framework
AudioStreaming is available under the MIT license. See the LICENSE file for more info.
This library takes inspiration on the already battled-tested streaming library, StreamingKit. Big 🙏 to Thong Nguyen (@tumtumtum) and Matt Gallagher (@mattgallagher) for AudioStreamer
FAQs
Unknown package
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Research
Security News
Socket researchers uncover a malicious npm package posing as a tool for detecting vulnerabilities in Etherium smart contracts.
Security News
Research
A supply chain attack on Rspack's npm packages injected cryptomining malware, potentially impacting thousands of developers.
Research
Security News
Socket researchers discovered a malware campaign on npm delivering the Skuld infostealer via typosquatted packages, exposing sensitive data.