mirror of
https://github.com/garagetinkering/Video_Game_Mini_Maps.git
synced 2026-01-17 17:47:00 +01:00
initial commit
This commit is contained in:
32
components/bsp_extra/CMakeLists.txt
Normal file
32
components/bsp_extra/CMakeLists.txt
Normal file
@@ -0,0 +1,32 @@
|
||||
set(SRCS "")
|
||||
list(APPEND SRCS
|
||||
"src/bsp_board_extra.c"
|
||||
)
|
||||
|
||||
set(INCLUDE_DIRS "")
|
||||
list(APPEND INCLUDE_DIRS "include")
|
||||
|
||||
foreach(SRC_DIR IN LISTS SRC_DIRS)
|
||||
file(GLOB_RECURSE SRC ${SRC_DIR}/*.c)
|
||||
list(APPEND SRCS ${SRC})
|
||||
list(APPEND INCLUDE_DIRS ${SRC_DIR}/include)
|
||||
endforeach()
|
||||
|
||||
idf_component_register(
|
||||
SRCS ${SRCS}
|
||||
INCLUDE_DIRS ${INCLUDE_DIRS}
|
||||
REQUIRES driver
|
||||
PRIV_REQUIRES esp_timer fatfs esp_psram esp_mm
|
||||
)
|
||||
|
||||
target_compile_options(
|
||||
${COMPONENT_LIB} PRIVATE
|
||||
-Wno-format
|
||||
-Wno-int-conversion
|
||||
-Wno-incompatible-pointer-types
|
||||
-Wunused-function
|
||||
-Wno-unused-variable
|
||||
-Wno-unused-function
|
||||
-Wno-overflow
|
||||
-Wno-unused-but-set-variable
|
||||
-Wno-discarded-qualifiers)
|
||||
202
components/bsp_extra/LICENSE
Normal file
202
components/bsp_extra/LICENSE
Normal file
@@ -0,0 +1,202 @@
|
||||
|
||||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
APPENDIX: How to apply the Apache License to your work.
|
||||
|
||||
To apply the Apache License to your work, attach the following
|
||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||
replaced with your own identifying information. (Don't include
|
||||
the brackets!) The text should be enclosed in the appropriate
|
||||
comment syntax for the file format. We also recommend that a
|
||||
file or class name and description of purpose be included on the
|
||||
same "printed page" as the copyright notice for easier
|
||||
identification within third-party archives.
|
||||
|
||||
Copyright [yyyy] [name of copyright owner]
|
||||
|
||||
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.
|
||||
19
components/bsp_extra/idf_component.yml
Normal file
19
components/bsp_extra/idf_component.yml
Normal file
@@ -0,0 +1,19 @@
|
||||
dependencies:
|
||||
idf:
|
||||
version: '>=5.3.0'
|
||||
|
||||
waveshare/esp32_p4_wifi6_touch_lcd_xc:
|
||||
version: "*"
|
||||
|
||||
chmorgan/esp-audio-player:
|
||||
version: "1.0.*"
|
||||
public: true
|
||||
|
||||
chmorgan/esp-file-iterator:
|
||||
version: "1.0.0"
|
||||
public: true
|
||||
|
||||
description: Board Support Package for ESP32-P4-NANO
|
||||
targets:
|
||||
- esp32p4
|
||||
version: 0.0.2
|
||||
219
components/bsp_extra/include/bsp_board_extra.h
Normal file
219
components/bsp_extra/include/bsp_board_extra.h
Normal file
@@ -0,0 +1,219 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2015-2024 Espressif Systems (Shanghai) CO LTD
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#include <stdbool.h>
|
||||
#include "esp_codec_dev.h"
|
||||
#include "esp_err.h"
|
||||
#include "driver/gpio.h"
|
||||
#include "driver/i2s_std.h"
|
||||
#include "audio_player.h"
|
||||
#include "file_iterator.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define CODEC_DEFAULT_SAMPLE_RATE (16000)
|
||||
#define CODEC_DEFAULT_BIT_WIDTH (16)
|
||||
#define CODEC_DEFAULT_ADC_VOLUME (24.0)
|
||||
#define CODEC_DEFAULT_CHANNEL (2)
|
||||
#define CODEC_DEFAULT_VOLUME (60)
|
||||
|
||||
#define BSP_LCD_BACKLIGHT_BRIGHTNESS_MAX (95)
|
||||
#define BSP_LCD_BACKLIGHT_BRIGHTNESS_MIN (0)
|
||||
#define LCD_LEDC_CH (CONFIG_BSP_DISPLAY_BRIGHTNESS_LEDC_CH)
|
||||
|
||||
/**************************************************************************************************
|
||||
* BSP Extra interface
|
||||
* Mainly provided some I2S Codec interfaces.
|
||||
**************************************************************************************************/
|
||||
/**
|
||||
* @brief Player set mute.
|
||||
*
|
||||
* @param enable: true or false
|
||||
*
|
||||
* @return
|
||||
* - ESP_OK: Success
|
||||
* - Others: Fail
|
||||
*/
|
||||
esp_err_t bsp_extra_codec_mute_set(bool enable);
|
||||
|
||||
/**
|
||||
* @brief Player set volume.
|
||||
*
|
||||
* @param volume: volume set
|
||||
* @param volume_set: volume set response
|
||||
*
|
||||
* @return
|
||||
* - ESP_OK: Success
|
||||
* - Others: Fail
|
||||
*/
|
||||
esp_err_t bsp_extra_codec_volume_set(int volume, int *volume_set);
|
||||
|
||||
/**
|
||||
* @brief Player get volume.
|
||||
*
|
||||
* @return
|
||||
* - volume: volume get
|
||||
*/
|
||||
int bsp_extra_codec_volume_get(void);
|
||||
|
||||
/**
|
||||
* @brief Stop I2S function.
|
||||
*
|
||||
* @return
|
||||
* - ESP_OK: Success
|
||||
* - Others: Fail
|
||||
*/
|
||||
esp_err_t bsp_extra_codec_dev_stop(void);
|
||||
|
||||
/**
|
||||
* @brief Resume I2S function.
|
||||
*
|
||||
* @return
|
||||
* - ESP_OK: Success
|
||||
* - Others: Fail
|
||||
*/
|
||||
esp_err_t bsp_extra_codec_dev_resume(void);
|
||||
|
||||
/**
|
||||
* @brief Set I2S format to codec.
|
||||
*
|
||||
* @param rate: Sample rate of sample
|
||||
* @param bits_cfg: Bit lengths of one channel data
|
||||
* @param ch: Channels of sample
|
||||
*
|
||||
* @return
|
||||
* - ESP_OK: Success
|
||||
* - Others: Fail
|
||||
*/
|
||||
esp_err_t bsp_extra_codec_set_fs(uint32_t rate, uint32_t bits_cfg, i2s_slot_mode_t ch);
|
||||
|
||||
/**
|
||||
* @brief Read data from recoder.
|
||||
*
|
||||
* @param audio_buffer: The pointer of receiving data buffer
|
||||
* @param len: Max data buffer length
|
||||
* @param bytes_read: Byte number that actually be read, can be NULL if not needed
|
||||
* @param timeout_ms: Max block time
|
||||
*
|
||||
* @return
|
||||
* - ESP_OK: Success
|
||||
* - Others: Fail
|
||||
*/
|
||||
esp_err_t bsp_extra_i2s_read(void *audio_buffer, size_t len, size_t *bytes_read, uint32_t timeout_ms);
|
||||
|
||||
/**
|
||||
* @brief Write data to player.
|
||||
*
|
||||
* @param audio_buffer: The pointer of sent data buffer
|
||||
* @param len: Max data buffer length
|
||||
* @param bytes_written: Byte number that actually be sent, can be NULL if not needed
|
||||
* @param timeout_ms: Max block time
|
||||
*
|
||||
* @return
|
||||
* - ESP_OK: Success
|
||||
* - Others: Fail
|
||||
*/
|
||||
esp_err_t bsp_extra_i2s_write(void *audio_buffer, size_t len, size_t *bytes_written, uint32_t timeout_ms);
|
||||
|
||||
|
||||
/**
|
||||
* @brief Initialize codec play and record handle.
|
||||
*
|
||||
* @return
|
||||
* - ESP_OK: Success
|
||||
* - Others: Fail
|
||||
*/
|
||||
esp_err_t bsp_extra_codec_init();
|
||||
|
||||
/**
|
||||
* @brief Initialize audio player task.
|
||||
*
|
||||
* @param path file path
|
||||
*
|
||||
* @return
|
||||
* - ESP_OK: Success
|
||||
* - Others: Fail
|
||||
*/
|
||||
esp_err_t bsp_extra_player_init(void);
|
||||
|
||||
/**
|
||||
* @brief Delete audio player task.
|
||||
*
|
||||
* @return
|
||||
* - ESP_OK: Success
|
||||
* - Others: Fail
|
||||
*/
|
||||
esp_err_t bsp_extra_player_del(void);
|
||||
|
||||
/**
|
||||
* @brief Initialize a file iterator instance
|
||||
*
|
||||
* @param path The file path for the iterator.
|
||||
* @param ret_instance A pointer to the file iterator instance to be returned.
|
||||
* @return
|
||||
* - ESP_OK: Successfully initialized the file iterator instance.
|
||||
* - ESP_FAIL: Failed to initialize the file iterator instance due to invalid parameters or memory allocation failure.
|
||||
*/
|
||||
esp_err_t bsp_extra_file_instance_init(const char *path, file_iterator_instance_t **ret_instance);
|
||||
|
||||
/**
|
||||
* @brief Play the audio file at the specified index in the file iterator
|
||||
*
|
||||
* @param instance The file iterator instance.
|
||||
* @param index The index of the file to play within the iterator.
|
||||
* @return
|
||||
* - ESP_OK: Successfully started playing the audio file.
|
||||
* - ESP_FAIL: Failed to play the audio file due to invalid parameters or file access issues.
|
||||
*/
|
||||
esp_err_t bsp_extra_player_play_index(file_iterator_instance_t *instance, int index);
|
||||
|
||||
/**
|
||||
* @brief Play the audio file specified by the file path
|
||||
*
|
||||
* @param file_path The path to the audio file to be played.
|
||||
* @return
|
||||
* - ESP_OK: Successfully started playing the audio file.
|
||||
* - ESP_FAIL: Failed to play the audio file due to file access issues.
|
||||
*/
|
||||
esp_err_t bsp_extra_player_play_file(const char *file_path);
|
||||
|
||||
/**
|
||||
* @brief Register a callback function for the audio player
|
||||
*
|
||||
* @param cb The callback function to be registered.
|
||||
* @param user_data User data to be passed to the callback function.
|
||||
*/
|
||||
void bsp_extra_player_register_callback(audio_player_cb_t cb, void *user_data);
|
||||
|
||||
/**
|
||||
* @brief Check if the specified audio file is currently playing
|
||||
*
|
||||
* @param file_path The path to the audio file to check.
|
||||
* @return
|
||||
* - true: The specified audio file is currently playing.
|
||||
* - false: The specified audio file is not currently playing.
|
||||
*/
|
||||
bool bsp_extra_player_is_playing_by_path(const char *file_path);
|
||||
|
||||
/**
|
||||
* @brief Check if the audio file at the specified index is currently playing
|
||||
*
|
||||
* @param instance The file iterator instance.
|
||||
* @param index The index of the file to check.
|
||||
* @return
|
||||
* - true: The audio file at the specified index is currently playing.
|
||||
* - false: The audio file at the specified index is not currently playing.
|
||||
*/
|
||||
bool bsp_extra_player_is_playing_by_index(file_iterator_instance_t *instance, int index);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
259
components/bsp_extra/src/bsp_board_extra.c
Normal file
259
components/bsp_extra/src/bsp_board_extra.c
Normal file
@@ -0,0 +1,259 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2015-2024 Espressif Systems (Shanghai) CO LTD
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#include <string.h>
|
||||
#include "esp_log.h"
|
||||
#include "esp_check.h"
|
||||
#include "esp_codec_dev_defaults.h"
|
||||
#include "esp_err.h"
|
||||
#include "esp_log.h"
|
||||
#include "esp_vfs_fat.h"
|
||||
#include "driver/i2c.h"
|
||||
#include "driver/i2s_std.h"
|
||||
#include "driver/gpio.h"
|
||||
#include "driver/ledc.h"
|
||||
|
||||
#include "bsp/esp-bsp.h"
|
||||
#include "bsp_board_extra.h"
|
||||
|
||||
static const char *TAG = "bsp_extra_board";
|
||||
|
||||
static esp_codec_dev_handle_t play_dev_handle;
|
||||
static esp_codec_dev_handle_t record_dev_handle;
|
||||
|
||||
static bool _is_audio_init = false;
|
||||
static bool _is_player_init = false;
|
||||
static int _vloume_intensity = CODEC_DEFAULT_VOLUME;
|
||||
|
||||
static audio_player_cb_t audio_idle_callback = NULL;
|
||||
static void *audio_idle_cb_user_data = NULL;
|
||||
static char audio_file_path[128];
|
||||
|
||||
/**************************************************************************************************
|
||||
*
|
||||
* Extra Board Function
|
||||
*
|
||||
**************************************************************************************************/
|
||||
|
||||
static esp_err_t audio_mute_function(AUDIO_PLAYER_MUTE_SETTING setting)
|
||||
{
|
||||
// Volume saved when muting and restored when unmuting. Restoring volume is necessary
|
||||
// as es8311_set_voice_mute(true) results in voice volume (REG32) being set to zero.
|
||||
|
||||
bsp_extra_codec_mute_set(setting == AUDIO_PLAYER_MUTE ? true : false);
|
||||
|
||||
// restore the voice volume upon unmuting
|
||||
if (setting == AUDIO_PLAYER_UNMUTE) {
|
||||
ESP_RETURN_ON_ERROR(esp_codec_dev_set_out_vol(play_dev_handle, _vloume_intensity), TAG, "Set Codec volume failed");
|
||||
}
|
||||
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
static void audio_callback(audio_player_cb_ctx_t *ctx)
|
||||
{
|
||||
if (audio_idle_callback) {
|
||||
ctx->user_ctx = audio_idle_cb_user_data;
|
||||
audio_idle_callback(ctx);
|
||||
}
|
||||
}
|
||||
|
||||
esp_err_t bsp_extra_i2s_read(void *audio_buffer, size_t len, size_t *bytes_read, uint32_t timeout_ms)
|
||||
{
|
||||
esp_err_t ret = ESP_OK;
|
||||
ret = esp_codec_dev_read(record_dev_handle, audio_buffer, len);
|
||||
*bytes_read = len;
|
||||
return ret;
|
||||
}
|
||||
|
||||
esp_err_t bsp_extra_i2s_write(void *audio_buffer, size_t len, size_t *bytes_written, uint32_t timeout_ms)
|
||||
{
|
||||
esp_err_t ret = ESP_OK;
|
||||
ret = esp_codec_dev_write(play_dev_handle, audio_buffer, len);
|
||||
*bytes_written = len;
|
||||
return ret;
|
||||
}
|
||||
|
||||
esp_err_t bsp_extra_codec_set_fs(uint32_t rate, uint32_t bits_cfg, i2s_slot_mode_t ch)
|
||||
{
|
||||
esp_err_t ret = ESP_OK;
|
||||
|
||||
esp_codec_dev_sample_info_t fs = {
|
||||
.sample_rate = rate,
|
||||
.channel = ch,
|
||||
.bits_per_sample = bits_cfg,
|
||||
};
|
||||
|
||||
if (play_dev_handle) {
|
||||
ret = esp_codec_dev_close(play_dev_handle);
|
||||
}
|
||||
if (record_dev_handle) {
|
||||
ret |= esp_codec_dev_close(record_dev_handle);
|
||||
ret |= esp_codec_dev_set_in_gain(record_dev_handle, CODEC_DEFAULT_ADC_VOLUME);
|
||||
}
|
||||
|
||||
if (play_dev_handle) {
|
||||
ret |= esp_codec_dev_open(play_dev_handle, &fs);
|
||||
}
|
||||
if (record_dev_handle) {
|
||||
ret |= esp_codec_dev_open(record_dev_handle, &fs);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
esp_err_t bsp_extra_codec_volume_set(int volume, int *volume_set)
|
||||
{
|
||||
ESP_RETURN_ON_ERROR(esp_codec_dev_set_out_vol(play_dev_handle, volume), TAG, "Set Codec volume failed");
|
||||
_vloume_intensity = volume;
|
||||
|
||||
ESP_LOGI(TAG, "Setting volume: %d", volume);
|
||||
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
int bsp_extra_codec_volume_get(void)
|
||||
{
|
||||
return _vloume_intensity;
|
||||
}
|
||||
|
||||
esp_err_t bsp_extra_codec_mute_set(bool enable)
|
||||
{
|
||||
esp_err_t ret = ESP_OK;
|
||||
ret = esp_codec_dev_set_out_mute(play_dev_handle, enable);
|
||||
return ret;
|
||||
}
|
||||
|
||||
esp_err_t bsp_extra_codec_dev_stop(void)
|
||||
{
|
||||
esp_err_t ret = ESP_OK;
|
||||
|
||||
if (play_dev_handle) {
|
||||
ret = esp_codec_dev_close(play_dev_handle);
|
||||
}
|
||||
|
||||
if (record_dev_handle) {
|
||||
ret = esp_codec_dev_close(record_dev_handle);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
esp_err_t bsp_extra_codec_dev_resume(void)
|
||||
{
|
||||
return bsp_extra_codec_set_fs(CODEC_DEFAULT_SAMPLE_RATE, CODEC_DEFAULT_BIT_WIDTH, CODEC_DEFAULT_CHANNEL);
|
||||
}
|
||||
|
||||
esp_err_t bsp_extra_codec_init()
|
||||
{
|
||||
if (_is_audio_init) {
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
play_dev_handle = bsp_audio_codec_speaker_init();
|
||||
assert((play_dev_handle) && "play_dev_handle not initialized");
|
||||
|
||||
record_dev_handle = bsp_audio_codec_microphone_init();
|
||||
assert((record_dev_handle) && "record_dev_handle not initialized");
|
||||
|
||||
bsp_extra_codec_set_fs(CODEC_DEFAULT_SAMPLE_RATE, CODEC_DEFAULT_BIT_WIDTH, CODEC_DEFAULT_CHANNEL);
|
||||
|
||||
_is_audio_init = true;
|
||||
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t bsp_extra_player_init(void)
|
||||
{
|
||||
if (_is_player_init) {
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
audio_player_config_t config = { .mute_fn = audio_mute_function,
|
||||
.write_fn = bsp_extra_i2s_write,
|
||||
.clk_set_fn = bsp_extra_codec_set_fs,
|
||||
.priority = 5
|
||||
};
|
||||
ESP_RETURN_ON_ERROR(audio_player_new(config), TAG, "audio_player_init failed");
|
||||
audio_player_callback_register(audio_callback, NULL);
|
||||
|
||||
_is_player_init = true;
|
||||
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t bsp_extra_player_del(void)
|
||||
{
|
||||
_is_player_init = false;
|
||||
|
||||
ESP_RETURN_ON_ERROR(audio_player_delete(), TAG, "audio_player_delete failed");
|
||||
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t bsp_extra_file_instance_init(const char *path, file_iterator_instance_t **ret_instance)
|
||||
{
|
||||
ESP_RETURN_ON_FALSE(path, ESP_FAIL, TAG, "path is NULL");
|
||||
ESP_RETURN_ON_FALSE(ret_instance, ESP_FAIL, TAG, "ret_instance is NULL");
|
||||
|
||||
file_iterator_instance_t *file_iterator = file_iterator_new(path);
|
||||
ESP_RETURN_ON_FALSE(file_iterator, ESP_FAIL, TAG, "file_iterator_new failed, %s", path);
|
||||
|
||||
*ret_instance = file_iterator;
|
||||
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t bsp_extra_player_play_index(file_iterator_instance_t *instance, int index)
|
||||
{
|
||||
ESP_RETURN_ON_FALSE(instance, ESP_FAIL, TAG, "instance is NULL");
|
||||
|
||||
ESP_LOGI(TAG, "play_index(%d)", index);
|
||||
char filename[128];
|
||||
int retval = file_iterator_get_full_path_from_index(instance, index, filename, sizeof(filename));
|
||||
ESP_RETURN_ON_FALSE(retval != 0, ESP_FAIL, TAG, "file_iterator_get_full_path_from_index failed");
|
||||
|
||||
ESP_LOGI(TAG, "opening file '%s'", filename);
|
||||
FILE *fp = fopen(filename, "rb");
|
||||
ESP_RETURN_ON_FALSE(fp, ESP_FAIL, TAG, "unable to open file");
|
||||
|
||||
ESP_LOGI(TAG, "Playing '%s'", filename);
|
||||
ESP_RETURN_ON_ERROR(audio_player_play(fp), TAG, "audio_player_play failed");
|
||||
|
||||
memcpy(audio_file_path, filename, sizeof(audio_file_path));
|
||||
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t bsp_extra_player_play_file(const char *file_path)
|
||||
{
|
||||
ESP_LOGI(TAG, "opening file '%s'", file_path);
|
||||
FILE *fp = fopen(file_path, "rb");
|
||||
ESP_RETURN_ON_FALSE(fp, ESP_FAIL, TAG, "unable to open file");
|
||||
|
||||
ESP_LOGI(TAG, "Playing '%s'", file_path);
|
||||
ESP_RETURN_ON_ERROR(audio_player_play(fp), TAG, "audio_player_play failed");
|
||||
|
||||
memcpy(audio_file_path, file_path, sizeof(audio_file_path));
|
||||
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
void bsp_extra_player_register_callback(audio_player_cb_t cb, void *user_data)
|
||||
{
|
||||
audio_idle_callback = cb;
|
||||
audio_idle_cb_user_data = user_data;
|
||||
}
|
||||
|
||||
bool bsp_extra_player_is_playing_by_path(const char *file_path)
|
||||
{
|
||||
return (strcmp(audio_file_path, file_path) == 0);
|
||||
}
|
||||
|
||||
bool bsp_extra_player_is_playing_by_index(file_iterator_instance_t *instance, int index)
|
||||
{
|
||||
return (index == file_iterator_get_index(instance));
|
||||
}
|
||||
Reference in New Issue
Block a user