Converting RhythmGame to float and other tidy ups
diff --git a/samples/shared/Mixer.h b/samples/shared/Mixer.h
new file mode 100644
index 0000000..52ccf37
--- /dev/null
+++ b/samples/shared/Mixer.h
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef SHARED_MIXER_H
+#define SHARED_MIXER_H
+
+#include <array>
+#include "IRenderableAudio.h"
+
+constexpr int32_t kBufferSize = 192*10;  // Temporary buffer is used for mixing
+constexpr uint8_t kMaxTracks = 100;
+
+/**
+ * A Mixer object which sums the output from multiple tracks into a single output. The number of
+ * input channels on each track must match the number of output channels (default 1=mono). This can
+ * be changed by calling `setChannelCount`.
+ */
+class Mixer : public IRenderableAudio {
+
+public:
+    void renderAudio(float *audioData, int32_t numFrames) {
+
+        // Zero out the incoming container array
+        memset(audioData, 0, sizeof(float) * numFrames * mChannelCount);
+
+        for (int i = 0; i < mNextFreeTrackIndex; ++i) {
+            mTracks[i]->renderAudio(mixingBuffer, numFrames);
+
+            for (int j = 0; j < numFrames * mChannelCount; ++j) {
+                audioData[j] += mixingBuffer[j];
+            }
+        }
+    }
+
+    void addTrack(std::shared_ptr<IRenderableAudio> renderer){
+        mTracks[mNextFreeTrackIndex++] = renderer;
+    }
+
+    void setChannelCount(int32_t channelCount){ mChannelCount = channelCount; }
+
+private:
+    float mixingBuffer[kBufferSize];
+    std::array<std::shared_ptr<IRenderableAudio>, kMaxTracks> mTracks;
+    uint8_t mNextFreeTrackIndex = 0;
+    int32_t mChannelCount = 1; // Default to mono
+};
+
+
+#endif //SHARED_MIXER_H