As far as connectivity is concerned, the most common speakers on the market fall under three categories:
- Wired - Usually ¼ or ⅛ inch stereo jacks, or RCA
- WiFi - Allow syncing between speakers connected to the same WAP, usually a non-portable system
- Bluetooth - Common in portable speakers, these allow direct streaming from a phone/PC/etc
We are interested in both portability and syncing multiple speakers. WiFi systems (such as Sonos) connect to your home router and have some sort of phone/computer interface for setup and streaming. That won’t work for us, because we don’t want to bring a router to the pool/beach/park. Technically it may be possible to create a speaker that serves as the access point that others connect to, but the resulting complexity and trade offs, along with the fact that there is a large selection of Bluetooth speakers available that many people own already, dictated we go with Bluetooth as our connection method.
Current Bluetooth speakers generally allow streaming from one source at a time, and not much else. Fortunately, some unique capabilities of the Bluetooth IC we’re using (CSR8670) presents us with a few options. Without too much work, it supports “sharing” a synchronized audio stream with a second CSR chip. This is perfect for a 2 speaker setup, and it is what we have implemented in our prototype.
Shown: Prototype with amp, battery, driver (only woofer here, no full range or tweeters). Two Bluetooth modules are connected and synced, audio source is the phone. The blue thing on the left is a cheap battery powered speaker.
The two obvious drawbacks to this approach are that the system is limited to 2 speakers, and that the second speaker must have a CSR chip. Many Bluetooth speakers do either use a CSR645, CSR8670, or earlier variant, but in any case we are still stuck with a maximum of 2. After considering several options to overcome this hurdle, we have decided to pursue an unorthodox solution. To meet the goal of connecting 6 speakers (including ours) we will add 2 more CSR8670 chips. The first chip will perform the same function as our current prototype, but also will output two PCM streams to the other CSR8670s using I2S. They will each be able to stream to two external speakers, which the CSR8670 is capable of doing when using a non-Bluetooth audio source. To help visualize the setup, see the below diagram.
A somewhat non-obvious issue with this configuration is dealing with Bluetooth audio latency. The speaker should be capable of connecting to any other Bluetooth speaker, but there is no standardized way in the Bluetooth A2DP spec of synchronizing this sort of arrangement. Since Bluetooth audio latency can range from 30ms to 200ms+, naively streaming to 5 other speakers is unlikely to sound good. A mismatch of 20-30ms or so is probably the upper limit of acceptable, so one speaker playing with 50ms latency and another with 180ms is problematic. The strategy we have come up with is to:
- Delay the speaker output 200ms when connected to external speakers
- Delay external speakers 100ms by default
- Implement manual controls for increasing/decreasing the delay for each external speaker in 10ms increments
- Remember previous delay for each paired speaker and use as default
The manual controls will be implemented in an Android/iPhone app, using CSR’s (Qualcomm) GAIA protocol. Due to NDA restrictions we can’t go into too much detail about how this is done, but you can view a high level explanation of GAIA here. The
We will work on this strategy over the next few weeks, and periodically log our progress.