Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ```
- /***************************************************
- This is an example for the Adafruit VS1053 Codec Breakout
- Designed specifically to work with the Adafruit VS1053 Codec Breakout
- ----> https://www.adafruit.com/products/1381
- Adafruit invests time and resources providing this open source code,
- please support Adafruit and open-source hardware by purchasing
- products from Adafruit!
- Written by Limor Fried/Ladyada for Adafruit Industries.
- BSD license, all text above must be included in any redistribution
- ****************************************************/
- // This is a very beta demo of Ogg Vorbis recording. It works...
- // Connect a button to digital 7 on the Arduino and use that to
- // start and stop recording.
- // A mic or line-in connection is required. See page 13 of the
- // datasheet for wiring
- // Don't forget to copy the v44k1q05.img patch to your micro SD
- // card before running this example!
- // include SPI, MP3 and SD libraries
- #include <SPI.h>
- #include <Adafruit_VS1053.h>
- #include <SD.h>
- // define the pins used
- #define SHIELD_RESET -1 // VS1053 reset pin (unused!)
- #define SHIELD_CS 7 // VS1053 chip select pin (output)
- #define SHIELD_DCS 6 // VS1053 Data/command select pin (output)
- #define CLK 13 // SPI Clock, shared with SD card
- #define MISO 12 // Input data, from VS1053/SD card
- #define MOSI 11 // Output data, to VS1053/SD card
- #define CARDCS 4 // Card chip select pin
- #define DREQ 3 // VS1053 Data request, ideally an Interrupt pin
- #define REC_BUTTON 10
- Adafruit_VS1053_FilePlayer musicPlayer =
- Adafruit_VS1053_FilePlayer(SHIELD_RESET, SHIELD_CS, SHIELD_DCS, DREQ, CARDCS);
- File recording; // the file we will save our recording to
- #define RECBUFFSIZE 128 // 64 or 128 bytes.
- uint8_t recording_buffer[RECBUFFSIZE];
- void setup() {
- Serial.begin(9600);
- Serial.println("Adafruit VS1053 Ogg Recording Test");
- // initialise the music player
- if (!musicPlayer.begin()) {
- Serial.println("VS1053 not found");
- while (1); // don't do anything more
- }
- musicPlayer.sineTest(0x44, 500); // Make a tone to indicate VS1053 is working
- if (!SD.begin(CARDCS)) {
- Serial.println("SD failed, or not present");
- while (1); // don't do anything more
- }
- Serial.println("SD OK!"); // when the button is pressed, record!
- // Set volume for left, right channels. lower numbers == louder volume!
- musicPlayer.setVolume(10, 10);
- pinMode(REC_BUTTON, INPUT);
- digitalWrite(REC_BUTTON, HIGH);
- // load plugin from SD card! We'll use mono 44.1KHz, high quality
- if (! musicPlayer.prepareRecordOgg("v44k1q05.img")) {
- Serial.println("Couldn't load plugin!");
- while (1);
- }
- }
- uint8_t isRecording = false;
- void loop() {
- Serial.println(digitalRead(REC_BUTTON));
- if (!isRecording && !digitalRead(REC_BUTTON)) {
- Serial.println("Begin recording");
- isRecording = true;
- // Check if the file exists already
- char filename[15];
- strcpy(filename, "RECORD00.OGG");
- for (uint8_t i = 0; i < 100; i++) {
- filename[6] = '0' + i / 10;
- filename[7] = '0' + i % 10;
- // create if does not exist, do not open existing, write, sync after write
- if (! SD.exists(filename)) {
- break;
- }
- }
- Serial.print("Recording to "); Serial.println(filename);
- recording = SD.open(filename, FILE_WRITE);
- if (! recording) {
- Serial.println("Couldn't open file to record!");
- while (1);
- }
- musicPlayer.startRecordOgg(true); // use microphone (for linein, pass in 'false')
- }
- if (isRecording)
- saveRecordedData(isRecording);
- if (isRecording && !digitalRead(REC_BUTTON)) {
- Serial.println("End recording");
- musicPlayer.stopRecordOgg();
- isRecording = false;
- // flush all the data!
- saveRecordedData(isRecording);
- // close it up
- recording.close();
- delay(1000);
- }
- }
- uint16_t saveRecordedData(boolean isrecord) {
- uint16_t written = 0;
- // read how many words are waiting for us
- uint16_t wordswaiting = musicPlayer.recordedWordsWaiting();
- // try to process 256 words (512 bytes) at a time, for best speed
- while (wordswaiting > 256) {
- //Serial.print("Waiting: "); Serial.println(wordswaiting);
- // for example 128 bytes x 4 loops = 512 bytes
- for (int x = 0; x < 512 / RECBUFFSIZE; x++) {
- // fill the buffer!
- for (uint16_t addr = 0; addr < RECBUFFSIZE; addr += 2) {
- uint16_t t = musicPlayer.recordedReadWord();
- //Serial.println(t, HEX);
- recording_buffer[addr] = t >> 8;
- recording_buffer[addr + 1] = t;
- }
- if (! recording.write(recording_buffer, RECBUFFSIZE)) {
- Serial.print("Couldn't write "); Serial.println(RECBUFFSIZE);
- while (1);
- }
- }
- // flush 512 bytes at a time
- recording.flush();
- written += 256;
- wordswaiting -= 256;
- }
- wordswaiting = musicPlayer.recordedWordsWaiting();
- if (!isrecord) {
- Serial.print(wordswaiting); Serial.println(" remaining");
- // wrapping up the recording!
- uint16_t addr = 0;
- for (int x = 0; x < wordswaiting - 1; x++) {
- // fill the buffer!
- uint16_t t = musicPlayer.recordedReadWord();
- recording_buffer[addr] = t >> 8;
- recording_buffer[addr + 1] = t;
- if (addr > RECBUFFSIZE) {
- if (! recording.write(recording_buffer, RECBUFFSIZE)) {
- Serial.println("Couldn't write!");
- while (1);
- }
- recording.flush();
- addr = 0;
- }
- }
- if (addr != 0) {
- if (!recording.write(recording_buffer, addr)) {
- Serial.println("Couldn't write!"); while (1);
- }
- written += addr;
- }
- musicPlayer.sciRead(VS1053_SCI_AICTRL3);
- if (! (musicPlayer.sciRead(VS1053_SCI_AICTRL3) & (1 << 2))) {
- recording.write(musicPlayer.recordedReadWord() & 0xFF);
- written++;
- }
- recording.flush();
- }
- return written;
- }
- ```
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement