Appendix B – Introduction to Windows Core Audio

For a little while now, I’ve been hard at work on a little side project. I almost hesitate to announce it at this point, because it’s still very early. But, what the heck. Why not. I’ve started writing a book. And no, it’s not one full of suspense and intrigue. Nor is it the next young adult break-out series. Turns out, I’m writing a programming book. The working title is “Practical Digital Audio for C++ Programmers”, which I admit is a mouthful. Henceforth (at least as far as this blog entry is concerned), I shall refer to it as PDA4CPP.

When I first started my audio programming journey, I quickly discovered there was a huge hole in the information available to newcomers to the field. There was plenty of material to be found regarding specific audio libraries. And there was even more material that discussed, in very mind-bendy ways, things like audio effects and synthesis that assumed you already had some level of comfort with digital audio programming. But there was very little in-between. And as a complete newb, I found it super discouraging. So I decided to do something about it. PDA4CPP is the fruits of my labor.

As I mentioned, the book is in its infancy. Only one chapter has been completed to date – Appendix B: Introduction to Windows Core Audio. But it’s a beast, coming in at 170 pages. In it, I talk about where Core Audio fits into the Windows story, the Windows audio architecture, device discovery, audio formats, WASAPI, audio rendering, and audio capturing.

Why did I start with Appendix B? Some of it was because of the questions and feedback I received from my blog entry, “A Brief History of Windows Audio APIs”. But mostly, I started with Appendix B because that’s where I needed to. Most of the book’s code will be implemented around a custom audio library that’s effectively a thin wrapper around platform-specific audio code. The Windows side of things provided as great a starting point as any.

Something I’m going to experiment with is making drafts of the book’s chapters available for purchase as I complete them. Not only will this help motivate me to keep writing, but it will also help me gauge interest. Appendix B is the first chapter available for purchase. Pricing for each chapter will vary based on each chapter’s size and density. More information can be found on the book’s page, which can be found under the “Pages” menu. An excerpt is available, as well as the chapter’s source code.

If you purchase the chapter and love it, hate it, or have ideas on how to improve it, please email me or leave a comment below.

Thanks!

-Shane

CppCon 2016 Trip Report


CppCon is an annual, week-long conference for the entire C++ community. Every year thus far, it’s been held at the Meydenbauer Center in beautiful Bellevue, Washington. It’s a young conference. This year marks only its third year. But the scale of the whole thing has allowed it to easily set itself apart from other C++ conferences. It’s huge.

This year, there were well over 900 attendees.(Edit: I had originally stated a 50% growth figure, which Jon Kalb pointed out was very wrong. Whoops! Sorry about that. Thanks, Jon! CppCon continues to grow, however!) The weekend leading up to conference is full of classes. And the weekdays are jam-packed with content, with sessions starting as early as 8AM and running as late as 10 at night. This year, there were typically six to seven tracks of sessions happening at the same time.

There’s always plenty to do and experience at CppCon. And it’s not always easy to decide on where to spend your time. Fortunately, all of the regular sessions are professionally recorded. So if you miss something, chances are you’ll be to find it on YouTube later on (the exceptions being classes, open content sessions, some lightning talks, etc.)

New This Year

There were a few things new at CppCon this year.

Last year, the committee experimented with a class offering for the weekend leading up to the conference. The class was such a success that they decided to expand the menu to five for this year.

Early-bird registrants got free CppCon t-shirts. This was a first for the conference.

This was also the first year they attempted a poster contest at CppCon. I believe there were only 4 posters submitted for this year. But this number will surely grow for next year, as attendees now know what to expect.

Session Stand-Outs

CppCon kicked-off with a keynote from Bjarne Stroustrup regarding the state of C++, how it got to be where it is today, and where it’s going. During this talk, Bjarne became uncharacteristically aggressive towards the C++ standards committee concerning C++17. It was clear that he was dissatisfied with the lack of progress made towards standardization of such features as concepts, modules, co-routines, etc. And it appears to me that the community as a whole sides with Bjarne on this matter. I counted at least ten, perhaps more, talks on features that are either in technical specification or in proposal status.

These were the sessions that really stood out for me this year.

Howard Hinnant’s “A <chrono> Tutorial” was a superb introduction to std::chrono. I have to confess that I’ve struggled to use this library effectively. It always frustrated me at how much code and how many data structures are involved in order to do the most basic of time-based calculations. Howard’s presentation changed my view of std::chrono entirely and made me realize that more often than not, I was just using std::chrono all wrong. 🙂

An interesting tidbit that came out of this discussion is that std::chrono’s epoch isn’t specified by the standard. I had (wrongly) assumed that it was always Jan 1 1970, just like that used by the time() function. Stephan Lavavej, who happened to be in the audience, spoke up and stated that the Microsoft VC++ implementation of std::chrono is changing its epoch to January 1, 1601, which is consistent with the Windows NT epoch. (Edit 2016/10/10: As Howard Hinnant notes in a comment below, this decision has been reversed by the VC++ team. Howard is currently working on a proposal to standardize the system_clock epoch to Jan. 1 1970.)

Timur Doumler’s “Want Fast C++? Know Your Hardware!”, was also an eye-opening talk. It was all about code organization and how it can affect performance, especially as it relates to the cache. After this talk, I’ll never look at reinterpret_cast the same. Timur is an audio guy. And audio is an area where performance really matters. Every talk I’ve seen of his has been wonderful. If you haven’t seen his CppCon 2015, JUCE Summit 2015, or BoostCon talks, I strongly recommend checking them out (in that order).

Jason Turner gave two solo talks at CppCon this year that were fantastic. “Rich Code for Tiny Machines: A Simple Commodore 64 Game in C++ 17” and “Practical Performance Practices” were both about performance. Throughout both of his presentations, he used the Godbolt Compiler Explorer to demonstrate the impact simple language features can have upon the resulting assembly code. Everything he discussed revolved around the premise that less instructions = faster code, so you didn’t really need to understand assembly to appreciate his talk.

Other sessions that I enjoyed were Tim Shen’s “Regular Expressions in C++, Present and Future”, Steve Carroll and Daniel Moth’s “Latest and Greatest from the Visual Studio Family for C++ Developers”, James McNellis’ “An Introduction to C++ Coroutines”, Dan Saks’ “extern “C”: Talking to C Programmers about C++”, Rob Irving and Jason Turner’s “What We’ve Learned from the C++ Community”, David Sankel’s “Building Software Capital”, Miodrag Milanovic’s “The MAME story: From C to Modern C++”, and Any Bondy’s “AAAARGH!? Adopting Almost Always Auto Reinforces Good Habits!?”

Conclusion

I’m sure there were many other stand-out sessions from other presenters. With so much going on at the same time, it’s impossible to not miss out on something fantastic. Once the videos are posted on YouTube, I’m sure I’ll stumble across more than one thing that I’ll kick myself for missing.

There were some faces that were notably absent this year, such as Andrei Alexandrescu, Scott Meyers (retired from the C++ scene, but I still hope to see pop up from time to time), and Peter Sommerlad. There were also a few people who I enjoy listening to that were present, but didn’t speak (Titus Winters, I’m talking about you).

All in all, 2016 was another great year for CppCon. If you’re a C++ programmer and have the opportunity to attend this conference, you should definitely go.

Review: C4Labs’ Pi Squared Enclosure

I recently decided to do another Raspberry Pi media center build using OSMC. My previous build using Raspbmc was a bit of an eyesore. The original enclosure I used was one of the traditional “pack ‘o cigarettes” style of cases that are so often more functional than stylish. Cables slither from all sides of it like tentacles. The IR receiver sits next to it, forever determined to be in any orientation except for right-side-up. There’s nothing pretty about that part of our TV stand. Nothing pretty at all.

For this build, I really wanted something nice to look at. Something a bit more polished. Perhaps something that looks more like a craftsman made it and less like something a computer nerd threw together. And that’s when I came across the Pi Squared enclosure from C4Labs.


The enclosure is made of a beautifully stained wood. The top of the enclosure is customizable at the time of order, with different options for the acrylic and the wood frame that sits on top of it. There are three options for the acrylic – clear, mist (white translucent), and black (completely opaque). The wood top also has three options – Mackintosh Rose, solid (which is more of a mini-drone frame shape), and frame (think picture frame). There are even two options for case size – standard and tall.

The enclosure only has one side configured for ports – where the USB and Ethernet connect. HDMI and power are attached at build time, with the cables routed out the back beside the Ethernet port. It comes with an HDMI elbow connector for this purpose and a zip-tie to keep the power cable seated in one spot.

It fits Raspberry Pi models 3, 2, and B+ and comes with three heat sinks that are intended to be applied to the CPU, network, and RAM chips.

Pros:

  • It’s very nice to look at.
  • Easy to assemble.
  • Once it’s together, it’s very solid.
  • The tall enclosure provides room for Pi HATs.
  • Provides a solution for cable management.
  • It has rubber feet to prevent scratching furniture.

Cons:

  • The HDMI and power cables can’t be easily disconnected without taking the whole thing apart. This makes it hard to travel with. It also poses a challenge if you need to share an HDMI cable with another device.
  • If you intend to use the mini-jack for audio or the camera connector, you’ll need to get creative. Creative may mean a drill or a saw.
  • I’m skeptical of the heat sinks. They attach to the chips using 3M adhesive strips. Will this hold up to heat? Maybe. But I expect the one attached to the RAM chip will fall off one day. No one says you need to use them though.

All in all, it’s a pretty sweet enclosure. Perfect for a media center build. And at $15.99 (at least of this writing), it’s also a good deal. If your intention is to build something stylish that rarely needs to be moved, give this enclosure a try.

Two thumbs up.