HulaLoop
Simple cross-platform audio loopback and recording.
sprint-one-planning
hulaloop-header-small.png
HulaLoop

**Sprint 1 Planning Document**

Team 30: Aneesh Gokhale, Emanuel Pituch, Jack McKernan, Neel Patel

**Sprint Overview**

During this sprint, we plan to work on the essential architecture and components of our application. We aim to first setup our development environments and dependencies (Qt Creator, GitHub, Jenkins, CMake, GoogleTest, JACK Audio, and PortAudio). Once setup, our goal is to begin the first interactions with the audio APIs of each of our targeted operating systems. This goal will lead us to develop the foundation for our audio backend. The sprint will also include the first workings of our user interfaces and the interconnection between the frontend and the backend. As a part of all this work, we will develop and adhere to coding standards and documentation.

**Scrum Master**

Jack McKernan

**Meeting Plan**

Monday, Wednesday, Friday 5:00 PM - 7:00 PM

**Risks and Challenges**

Since this is the first sprint, we will likely face many challenges, including ones that we cannot currently foresee. Some of the primary challenges that we do foresee, however, are configuring dependencies and environments for CI servers and each developer, using previously unexplored APIs and technologies, and setting coding standards and guidelines. Some of the risk that we associate with this sprint is directly linked to the challenge of using previously unexplored APIs and technologies. Since the system-level APIs and structures are complex and differ for each system, we anticipate a steep learning curve using these. As they form the basis for our application, we plan to dedicate great effort to optimally designing them. This may involve changing our initial assumptions about the structure or organization of our classes.

**Current Sprint Detail**

**User Story #1:**

As a developer, I would like to get an audio sample from Windows.

Task # Description Time (hrs) Owner
1 Research and implement the WASAPI interface 4 Neel
2 Wrap WASAPI specific details into the Device class 3 Neel
3 Initialize a WASAPI endpoint as a Device 1 Neel
4 Handle device/WASAPI errors 2 Neel
5 Request and render a sample from the Device 3 Neel
6 Unit Test - Read from input and output devices to ensure sampling process works correctly 1 Neel

Acceptance Criteria:

As a developer, I would like to get an audio sample from Linux.

Task # Description Time (hrs) Owner
1 Research and implement the JACK2 interface for Linux 4 Emanuel
2 Wrap JACK2 specific details into the Device class 3 Emanuel
3 Initialize JACK2 Device 1 Emanuel
4 Handle device/JACK2 errors 2 Emanuel
5 Request and render a sample from the Device 3 Emanuel
6 Unit Test - Read from input and output devices to ensure sampling process works correctly 1 Emanuel

Acceptance Criteria:

As a developer, I would like to get an audio sample from Mac OS X.

Task # Description Time (hrs) Owner
1 Research and implement the JACK2 interface for macOS 4 Jack
2 Wrap JACK2 specific details into the Device class 3 Jack
3 Initialize JACK2 Device 1 Jack
4 Handle device/JACK2 errors 2 Jack
5 Request and render a sample from the Device 3 Jack
6 Unit Test - Read from input and output devices to ensure sampling process works correctly 1 Jack

Acceptance Criteria:

As a user, I would like to view all available audio devices.

Task # Description Time (hrs) Owner
1 Get list of available audio devices from Windows 2 Neel
2 Get list of available audio devices from macOS 2 Jack
3 Get list of available audio devices from Linux 2 Emanuel
4 Store input and output device lists in OSAudio 1 Neel
5 Build interface between Controller and OSAudio 1 Neel
6 Build Device interface between Controller and GUI 2 Neel
7 Display Device information in GUI combo-boxes 1 Emanuel
8 Unit Test - Verify the interface between Controller and OSAudio 1 Emanuel
9 Unit Test - Verify the interface between Controller and user interfaces 1 Emanuel

Acceptance Criteria:

As a developer, I would like the build system to be modular and support cross-platform compilation.

Task # Description Time (hrs) Owner
1 Design CMake build script 6 (3 per person) Jack & Neel
2 Build and customize additional libraries (GoogleTest, Qt, JACK Audio, PortAudio) 4 (1 per lib) Jack & Neel
3 Configure and organize modules to compile as static or dynamic libraries (.so/.a, .lib/.dll) and link into the final application 2 Aneesh
4 Add CMake flags to allow compiling only certain modules or configurations of the application 2 Aneesh
5 Experiment with CPack to create a basic installer 3 Aneesh

Acceptance Criteria:

As a developer, I would like to setup a continuous integration (CI) process so that each repository push triggers a build and runs tests.

Task # Description Time (hrs) Owner
1 Create Jenkins pipelines for Windows, Linux, and macOS 3 Jack
2 Configure dependencies on each server 2 Jack
3 Create build and test scripts in the scripting language of each OS 3 Aneesh
4 Generate code coverage reports after test suite completion and upload to codecov.io 1 Aneesh

Acceptance Criteria:

As a user, I would like to have a GUI.

Task # Description Time (hrs) Owner
1 Implement bridge between C++ and QML 2 Aneesh
2 Layout the GUI components using a layout manager 2 Aneesh
3 Design color scheme and styles 1 Aneesh
4 Implement color scheme and styles 1 Aneesh

Acceptance Criteria:

**User Story #8:**

As a user, I would like to have a button to start audio recording.

Task # Description Time (hrs) Owner
1 Add styled start button to layout manager 1 Aneesh
2 Integrate button with Transport backend 1 Aneesh
3 Unit Test - Verify the button sends the expected signal 0.25 Aneesh

Acceptance Criteria:

**User Story #9:**

As a user, I would like to have a button to stop audio recording.

Task # Description Time (hrs) Owner
1 Add styled stop button to layout manager 1 Aneesh
2 Integrate button with Transport backend 1 Aneesh
3 Unit Test - Verify the button sends the expected signal 0.25 Aneesh

Acceptance Criteria:

**User Story #10:**

As a user, I would like to have a button that starts playback of recorded audio.

Task # Description Time (hrs) Owner
1 Add styled play button to layout manager 1 Aneesh
2 Integrate button with Transport backend 1 Aneesh
3 Unit Test - Verify the button sends the expected signal 0.25 Aneesh

Acceptance Criteria:

**User Story #11:**

As a user, I would like to have a button that pauses playback of recorded audio.

Task # Description Time (hrs) Owner
1 Add styled pause button to layout manager 1 Aneesh
2 Integrate button with Transport backend 1 Aneesh
3 Unit Test - Verify the button sends the expected signal 0.25 Aneesh

Acceptance Criteria:

**User Story #12:**

As a user, I would like to delay the start of a recording by a specified amount of time.

Task # Description Time (hrs) Owner
1 Add styled timer button to layout manager 1 Emanuel
2 Add drop-down list with time options 1 Emanuel
3 Add textfield to show remaining countdown time 1 Emanuel
4 Integrate timer with Transport 2 Emanuel
5 Unit Test - Verify the button sends the expected signal 0.25 Emanuel
6 Unit Test - Various timer options successfully result in starting a recording 0.25 Emanuel

Acceptance Criteria:

**User Story #13:**

As a user, I would like to record audio for a specified amount of time.

Task # Description Time (hrs) Owner
1 Add styled timer button to layout manager 1 Aneesh
2 Add drop-down list with time options 1 Aneesh
3 Add textfield to show remaining recording time 1 Aneesh
4 Integrate timer with Transport 2 Aneesh
5 Unit Test - Verify the button sends the expected signal 0.25 Aneesh
6 Unit Test - Various timer options successfully result in stopping a recording 0.25 Aneesh

Acceptance Criteria:

**User Story #14:**

As a developer, I would like a documented API so that third-party developers can use this system in their applications.

Task # Description Time (hrs) Owner
1 Perform code reviews and establish coding standards 4 (1 per person) Aneesh, Emanuel, Jack, Neel
2 Setup code quality and static analysis tools 1 Emanuel
3 Act on results of code quality, static analysis, and code coverage to improve existing code 12 (1 per person per week) Aneesh, Emanuel, Jack, Neel
4 Automatically generate documentation from code using Doxygen 3 Jack
5 Host auto-updated and versioned documentation on readthedocs.io 3 Neel

Acceptance Criteria:

**User Story #15:**

As a user, I would like to have a visualizer.

Task # Description Time (hrs) Owner
1 Research and understand project/technology 5 Meriem (New Team Member)
2 Create separate QML window/layout 2 Meriem
3 Create visualizer mockups 3 Meriem
4 Implement mockup in QML 4 Meriem
5 Make visualizer responsive with mocked data 3 Meriem

Acceptance Criteria:

Remaining Product Backlog

Functional Requirements

  1. ~~As a user, I would like to view all available audio devices.~~
  2. ~~As a user, I would like to choose an input device to record audio from.~~
  3. As a user, I would like to choose an output device to record audio from (loopback).
  4. As a user, I would like to choose the output device on which I hear monitored audio.
  5. ~~As a user, I would like to have a GUI.~~
  6. ~~As a user, I would like to have a button to start audio recording.~~
  7. ~~As a user, I would like to have a button to stop audio recording.~~
  8. ~~As a user, I would like to delay the start of a recording by a specified amount of time.~~
  9. As a user, I would like to record audio for a specified amount of time.
  10. As a user, I would like to record until I manually stop the recording.
  11. As a user, I would like the application to automatically write to a new file when file size limit is exceeded so that recording can continue seamlessly.
  12. As a user, I would like to pause the capture process.
  13. As a user, I would like to resume the capture process.
  14. As a user, I would like to adjust the volume of monitored audio (if time allows).
  15. As a user, I would like to visualize audio from the selected device (if time allows).
  16. As a user, I would like to trim captured audio (if time allows).
  17. As a user, I would like to add audio filters (if time allows).
  18. As a user, I would like to play back what was most recently recorded.
  19. ~~As a user, I would like to have a button that starts playback of recorded audio.~~
  20. ~~As a user, I would like to have a button that pauses playback of recorded audio.~~
  21. As a user, I would like to export captured audio to a file.
  22. As a user, I would like to choose the bitrate for exported files.
  23. As a user, I would like to choose the bit-depth for exported files.
  24. As a user, I would like to export captured audio in WAV format.
  25. As a user, I would like to export captured audio in MP3 format.
  26. As a user, I would like to export my audio in other formats (if time allows).
  27. As a user, I would like to be able to link my Google Drive account (if time allows).
  28. As a user, I would like to be able to link my Dropbox account (if time allows).
  29. As a user, I would like to be able to upload captured audio to linked storage services (if time allows).
  30. ~~As a developer, I would like to get an audio sample from Windows.~~
  31. ~~As a developer, I would like to get an audio sample from Mac OS X.~~
  32. ~~As a developer, I would like to get an audio sample from Linux.~~
  33. As a third party developer, I would like to set the device from which I capture audio.

Non-Functional Requirements

  1. ~~As a developer, I would like the build system to be modular.~~
  2. ~~As a developer, I would like the build system to support cross-platform compilation.~~
  3. ~~As a developer, I would like to setup a continuous integration (CI) process so that each repository push triggers a build and runs tests.~~
  4. ~~As a developer, I would like a documented API so that third-party developers can use this system in their applications.~~
  5. As a developer, I would like the application to work on Windows, Mac OS X, and Debian-based Linux.
  6. As a third-party developer, I would like to easily use the project’s libraries in my application.
  7. As a developer, I would like the application to have a long MTBF.
  8. As a developer, I would like the system audio being recorded to be compressed on-the-fly to conserve disk space and extend maximum recording duration.
  9. As a developer, I would like at least 70% of our code to be covered by the test suites.
  10. As a user, I would like to be informed when the application is recording system audio.
  11. As a user, I would like my application to stay up-to-date.
  12. As a user, I would like the installation process to be both intuitive and take less than three minutes.
  13. As a user, I would like to be able to check for updates manually within the application.
  14. As a user, I would like the GUI to be intuitive and straightforward.
  15. As a user, I would like the CLI to provide the same feature set as the GUI.