Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/evgenyneu/Cephalopod

A sound fader for AVAudioPlayer written in Swift for iOS, tvOS and macOS.
https://github.com/evgenyneu/Cephalopod

avaudioplayer sound swift

Last synced: 3 months ago
JSON representation

A sound fader for AVAudioPlayer written in Swift for iOS, tvOS and macOS.

Awesome Lists containing this project

README

        

# Cephalopod, a sound fader for AvAudioPlayer written in Swift - iOS, tvOS and macOS

[![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage)
[![CocoaPods Version](https://img.shields.io/cocoapods/v/Cephalopod.svg?style=flat)](http://cocoadocs.org/docsets/Cephalopod)
[![License](https://img.shields.io/cocoapods/l/Cephalopod.svg?style=flat)](LICENSE)
[![Platform](https://img.shields.io/cocoapods/p/Cephalopod.svg?style=flat)](http://cocoadocs.org/docsets/Cephalopod)

This library can help fading sounds in and out with AvAudioPlayer. One can set duration, velocity of the fade and a completion function. Velocity can vary from linear to exponential.

```Swift
cephalopod = Cephalopod(player: player)
cephalopod?.fadeIn()
```

Juvenile cuttlefish camouflaged against the seafloor

*Juvenile cuttlefish camouflaged against the seafloor. Photo taken by [Raul654](https://en.wikipedia.org/wiki/User:Raul654). Source: [Wikimedia Commons](https://en.wikipedia.org/wiki/File:Camouflage.jpg).*

## Setup

There are three ways you can add Cephalopod to your Xcode project.

#### Add source (iOS 7+)

Simply add the [CephalopodDistrib.swift](https://github.com/evgenyneu/Cephalopod/blob/master/Distrib/CephalopodDistrib.swift) file to your project.

#### Setup with Carthage (iOS 8+)

Alternatively, add `github "evgenyneu/Cephalopod" ~> 4.0` to your Cartfile and run `carthage update`.

#### Setup with CocoaPods (iOS 8+)

If you are using CocoaPods add this text to your Podfile and run `pod install`.

```
use_frameworks!
target 'Your target name'
pod 'Cephalopod', '~> 4.0'
```

### Legacy Swift versions

Setup a [previous version](https://github.com/evgenyneu/Cephalopod/wiki/Legacy-Swift-versions) of the library if you use an older version of Swift.

## Usage

The following example shows how to play an mp3 file with a fade in effect.

```Swift
import AVFoundation
import Cephalopod // For CocoaPods and Carthage
// ---

var playerInstance: AVAudioPlayer?
var cephalopod: Cephalopod?

override func viewDidLoad() {
super.viewDidLoad()

// Create a player instance
guard let path = Bundle.main.path(forResource: "squid", ofType: "mp3") else { return }
guard let player = try? AVAudioPlayer(contentsOf: URL(fileURLWithPath: path)) else { return }
playerInstance = player

// Start audio playback
player.play()
player.volume = 0

// Fade in the sound
cephalopod = Cephalopod(player: player)
cephalopod?.fadeIn()
}
```

### Fade in / fade out

```Swift
cephalopod?.fadeIn()
cephalopod?.fadeOut()

// Supply fade duration and velocity, in seconds
cephalopod?.fadeIn(duration: 3, velocity: 2)
cephalopod?.fadeOut(duration: 3, velocity: 2)

// Supply finish closure
cephalopod?.fadeIn(duration: 3, velocity: 2) { finished in }
cephalopod?.fadeOut(duration: 3, velocity: 2) { finished in }
```

### Supply fade start/end volume and completion callback

```Swift
cephalopod?.fade(fromVolume: 0.3, toVolume: 0.7, duration: 3, velocity: 2) { finished in
print("Finished fading")
}
```

**Arguments**:

`fromVolume` - the start volume, a number between 0 and 1.

`toVolume` - the end volume, a number between 0 and 1.

`duration` - duration of the fade, in seconds. Default duration: 3 seconds.

`velocity` - a number specifying how fast the sound volume is changing. Velocity of 0 creates a linear fade. Values greater than zero produce more exponential fade affect. Exponential fade sounds more gradual to a human ear. The fade sounds most natural with velocity parameter from 2 to 5. Default value: 2.

`onFinished` - an optional closure that will be called after the fade has ended. The closure will be passed a boolean parameter `finished` indicating whether the fading has reached its end value (`true`) or if the fading has been cancelled (`false`).

### Set the quality of fade

```Swift
cephalopod?.volumeAlterationsPerSecond = 20
```

Larger numbers will produce finer fade effect at expense of CPU juice. Default value: `30`.

### Stop the volume change

One can cancel the ongoing volume change by calling the `stop()` method. Note that it stops changing the volume but does not stop the playback.

```Swift
cephalopod?.stop()
```

## Volume functions

The following graph shows how sound volume changes during the fade.

Sound fade logarithmic velocity function for iOS/Swift

### Fade in formula

Sound fade out logarithmic formula

### Fade out formula

Sound fade in logarithmic formula

Where `x` is time and `v` is velocity.

Velocity of 0 creates a linear fade. Values greater than zero produce more exponential fade affect. Exponential fade sounds more gradual to a human ear. I personally use velocity values from 2 to 5.

Live graph demo: https://www.desmos.com/calculator/wnstesdf0h

## Demo app

Cephalopod sound fader for iOS written in swift

## Alternative solutions

Here is a list of other sound libraries for iOS.

* [AudioPlayerSwift](https://github.com/tbaranes/AudioPlayerSwift)
* [AudioPlayer](https://github.com/delannoyk/AudioPlayer)

## Thanks 👍

* [nschucky](https://github.com/nschucky) for updating to Swift 2.2 selector syntax.

## Credits

* The lovely music was recorded by [Carlos Vallejo](http://www.flashkit.com/loops/Easy_Listening/Ill_Be_-Carlos_V-10012/index.php).

* "*Juvenile cuttlefish camouflaged against the seafloor*" photo was taken by [Raul654](https://en.wikipedia.org/wiki/User:Raul654). Source: [Wikimedia Commons](https://en.wikipedia.org/wiki/File:Camouflage.jpg).

## License

Cephalopod is released under the [MIT License](LICENSE).

## Feedback is welcome

If you notice any issue, got stuck or just want to chat feel free to create an issue. I will be happy to help you.