test_audio_dump.cpp (1806B)
1 /* 2 * Copyright © 2023 Mozilla Foundation 3 * 4 * This program is made available under an ISC-style license. See the 5 * accompanying file LICENSE for details. 6 */ 7 8 #define NOMINMAX 9 #define _USE_MATH_DEFINES 10 11 #include "cubeb/cubeb.h" 12 #include <ratio> 13 14 #include "cubeb_audio_dump.h" 15 #include "gtest/gtest.h" 16 #include <chrono> 17 #include <cmath> 18 #include <fstream> 19 #include <iostream> 20 #include <thread> 21 22 TEST(cubeb, audio_dump) 23 { 24 cubeb_audio_dump_session_t session; 25 int rv = cubeb_audio_dump_init(&session); 26 ASSERT_EQ(rv, 0); 27 28 cubeb_stream_params params; 29 params.rate = 44100; 30 params.channels = 2; 31 params.format = CUBEB_SAMPLE_FLOAT32NE; 32 33 cubeb_audio_dump_stream_t dump_stream; 34 rv = cubeb_audio_dump_stream_init(session, &dump_stream, params, "test.wav"); 35 ASSERT_EQ(rv, 0); 36 37 rv = cubeb_audio_dump_start(session); 38 ASSERT_EQ(rv, 0); 39 40 float phase = 0; 41 const size_t buf_sz = 2 * 44100 / 50; 42 float buf[buf_sz]; 43 for (uint32_t iteration = 0; iteration < 50; iteration++) { 44 uint32_t write_idx = 0; 45 for (uint32_t i = 0; i < buf_sz / params.channels; i++) { 46 for (uint32_t j = 0; j < params.channels; j++) { 47 buf[write_idx++] = sin(phase); 48 } 49 phase += 440 * M_PI * 2 / 44100; 50 if (phase > 2 * M_PI) { 51 phase -= 2 * M_PI; 52 } 53 } 54 rv = cubeb_audio_dump_write(dump_stream, buf, 2 * 44100 / 50); 55 std::this_thread::sleep_for(std::chrono::milliseconds(100)); 56 ASSERT_EQ(rv, 0); 57 } 58 59 std::this_thread::sleep_for(std::chrono::milliseconds(100)); 60 61 rv = cubeb_audio_dump_stop(session); 62 ASSERT_EQ(rv, 0); 63 64 rv = cubeb_audio_dump_stream_shutdown(session, dump_stream); 65 ASSERT_EQ(rv, 0); 66 67 rv = cubeb_audio_dump_shutdown(session); 68 ASSERT_EQ(rv, 0); 69 70 std::ifstream file("test.wav"); 71 ASSERT_TRUE(file.good()); 72 } 73 74 #undef NOMINMAX