| // Copyright (c) 2012 The Chromium OS Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include <gtest/gtest.h> |
| |
| #include "cras_dsp.h" |
| #include "cras_dsp_module.h" |
| |
| #define FILENAME_TEMPLATE "DspTest.XXXXXX" |
| |
| namespace { |
| |
| extern "C" { |
| struct dsp_module* cras_dsp_module_load_ladspa(struct plugin* plugin) { |
| return NULL; |
| } |
| } |
| |
| class DspTestSuite : public testing::Test { |
| protected: |
| virtual void SetUp() { |
| strcpy(filename, FILENAME_TEMPLATE); |
| int fd = mkstemp(filename); |
| fp = fdopen(fd, "w"); |
| } |
| |
| virtual void TearDown() { |
| CloseFile(); |
| unlink(filename); |
| } |
| |
| virtual void CloseFile() { |
| if (fp) { |
| fclose(fp); |
| fp = NULL; |
| } |
| } |
| |
| char filename[sizeof(FILENAME_TEMPLATE) + 1]; |
| FILE* fp; |
| }; |
| |
| TEST_F(DspTestSuite, Simple) { |
| const char* content = |
| "[M1]\n" |
| "library=builtin\n" |
| "label=source\n" |
| "purpose=capture\n" |
| "output_0={audio}\n" |
| "disable=(not (equal? variable \"foo\"))\n" |
| "[M2]\n" |
| "library=builtin\n" |
| "label=sink\n" |
| "purpose=capture\n" |
| "input_0={audio}\n" |
| "\n"; |
| fprintf(fp, "%s", content); |
| CloseFile(); |
| |
| cras_dsp_init(filename); |
| struct cras_dsp_context *ctx1, *ctx3, *ctx4; |
| ctx1 = cras_dsp_context_new(44100, "playback"); /* wrong purpose */ |
| ctx3 = cras_dsp_context_new(44100, "capture"); |
| ctx4 = cras_dsp_context_new(44100, "capture"); |
| |
| cras_dsp_set_variable_string(ctx1, "variable", "foo"); |
| cras_dsp_set_variable_string(ctx3, "variable", "bar"); /* wrong value */ |
| cras_dsp_set_variable_string(ctx4, "variable", "foo"); |
| |
| cras_dsp_load_pipeline(ctx1); |
| cras_dsp_load_pipeline(ctx3); |
| cras_dsp_load_pipeline(ctx4); |
| |
| /* only ctx4 should load the pipeline successfully */ |
| ASSERT_EQ(NULL, cras_dsp_get_pipeline(ctx1)); |
| ASSERT_EQ(NULL, cras_dsp_get_pipeline(ctx3)); |
| |
| struct pipeline* pipeline = cras_dsp_get_pipeline(ctx4); |
| ASSERT_TRUE(pipeline); |
| cras_dsp_put_pipeline(ctx4); |
| |
| /* change the variable to a wrong value, and we should fail to reload. */ |
| cras_dsp_set_variable_string(ctx4, "variable", "bar"); |
| cras_dsp_load_pipeline(ctx4); |
| ASSERT_EQ(NULL, cras_dsp_get_pipeline(ctx4)); |
| |
| /* change the variable back, and we should reload successfully. */ |
| cras_dsp_set_variable_string(ctx4, "variable", "foo"); |
| cras_dsp_reload_ini(); |
| ASSERT_TRUE(cras_dsp_get_pipeline(ctx4)); |
| |
| cras_dsp_context_free(ctx1); |
| cras_dsp_context_free(ctx3); |
| cras_dsp_context_free(ctx4); |
| cras_dsp_stop(); |
| } |
| |
| static int empty_instantiate(struct dsp_module* module, |
| unsigned long sample_rate) { |
| return 0; |
| } |
| |
| static void empty_connect_port(struct dsp_module* module, |
| unsigned long port, |
| float* data_location) {} |
| |
| static int empty_get_delay(struct dsp_module* module) { |
| return 0; |
| } |
| |
| static void empty_run(struct dsp_module* module, unsigned long sample_count) {} |
| |
| static void empty_deinstantiate(struct dsp_module* module) {} |
| |
| static void empty_free_module(struct dsp_module* module) { |
| free(module); |
| } |
| |
| static int empty_get_properties(struct dsp_module* module) { |
| return 0; |
| } |
| |
| static void empty_dump(struct dsp_module* module, struct dumper* d) { |
| dumpf(d, "built-in module\n"); |
| } |
| |
| static void empty_init_module(struct dsp_module* module) { |
| module->instantiate = &empty_instantiate; |
| module->connect_port = &empty_connect_port; |
| module->get_delay = &empty_get_delay; |
| module->run = &empty_run; |
| module->deinstantiate = &empty_deinstantiate; |
| module->free_module = &empty_free_module; |
| module->get_properties = &empty_get_properties; |
| module->dump = &empty_dump; |
| } |
| |
| } // namespace |
| |
| extern "C" { |
| struct dsp_module* cras_dsp_module_load_builtin(struct plugin* plugin) { |
| struct dsp_module* module; |
| module = (struct dsp_module*)calloc(1, sizeof(struct dsp_module)); |
| empty_init_module(module); |
| return module; |
| } |
| void cras_dsp_module_set_sink_ext_module(struct dsp_module* module, |
| struct ext_dsp_module* ext_module) {} |
| } // extern "C" |
| |
| int main(int argc, char** argv) { |
| ::testing::InitGoogleTest(&argc, argv); |
| return RUN_ALL_TESTS(); |
| } |