// 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(); }