void playTone(int tone, int duration) { // tone is in us delay long i; for (i = 0; i < duration * 1000L; i += tone * 2) { generateTone(tone*2); } }
void Generator::generateData(const QAudioFormat& format, unsigned char* ptr, qint64 length) { const int channelBytes = format.sampleSize() / 8; if (length <= 0) return; QMutexLocker lock(m_mutex); QVector<qreal> channels; channels.resize(2); // LOG_INFO() << "generating Sounds" << QDateTime::currentDateTime() << length; initializeSounds(); while (length) { generateTone(channels[0], channels[1], m_sampleIndex); //const qreal x = soundFunc(2 * M_PI * frequency * qreal(sampleIndex ) / format.sampleRate()); for (int i=0; i<format.channelCount(); ++i) { if (format.sampleSize() == 8 && format.sampleType() == QAudioFormat::UnSignedInt) { const quint8 value = static_cast<quint8>((1.0 + channels[i]) / 2 * 255); *reinterpret_cast<quint8*>(ptr) = value; } else if (format.sampleSize() == 8 && format.sampleType() == QAudioFormat::SignedInt) { const qint8 value = static_cast<qint8>(channels[i] * 127); *reinterpret_cast<quint8*>(ptr) = value; } else if (format.sampleSize() == 16 && format.sampleType() == QAudioFormat::UnSignedInt) { quint16 value = static_cast<quint16>((1.0 + channels[i]) / 2 * 65535); if (format.byteOrder() == QAudioFormat::LittleEndian) qToLittleEndian<quint16>(value, ptr); else qToBigEndian<quint16>(value, ptr); } else if (format.sampleSize() == 16 && format.sampleType() == QAudioFormat::SignedInt) { qint16 value = static_cast<qint16>(channels[i] * 32767); if (format.byteOrder() == QAudioFormat::LittleEndian) qToLittleEndian<qint16>(value, ptr); else qToBigEndian<qint16>(value, ptr); } ptr += channelBytes; length -= channelBytes; } ++m_sampleIndex; } }
int main(void) { int i=0; int period_us = 0x55; int num_cycles = 10; u32 cmd; arduino_init(0,0,0,0); /* * Configuring IO Switch to connect GPIO * bit-0 will be controlled by the software to drive the speaker * Buzzer is connected to bit[0] of the Channel 1 of AXI GPIO instance */ config_arduino_switch(A_GPIO, A_GPIO, A_GPIO, A_GPIO, A_GPIO, A_GPIO, D_GPIO, D_GPIO, D_GPIO, D_GPIO, D_GPIO, D_GPIO, D_GPIO, D_GPIO, D_GPIO, D_GPIO, D_GPIO, D_GPIO, D_GPIO); XGpio_Initialize(&pb_speaker, XPAR_GPIO_1_DEVICE_ID); XGpio_SetDataDirection(&pb_speaker, SPEAKER_CHANNEL, 0x0); // initially keep it OFF XGpio_DiscreteWrite(&pb_speaker, 1, 0); while(1){ while((MAILBOX_CMD_ADDR & 0x01)==0); cmd = MAILBOX_CMD_ADDR; switch(cmd){ case CONFIG_IOP_SWITCH: shift = MAILBOX_DATA(0)-2; config_arduino_switch(A_GPIO, A_GPIO, A_GPIO, A_GPIO, A_GPIO, A_GPIO, D_GPIO, D_GPIO, D_GPIO, D_GPIO, D_GPIO, D_GPIO, D_GPIO, D_GPIO, D_GPIO, D_GPIO, D_GPIO, D_GPIO, D_GPIO); XGpio_Initialize(&pb_speaker, XPAR_GPIO_1_DEVICE_ID); XGpio_SetDataDirection(&pb_speaker, SPEAKER_CHANNEL, 0x0); XGpio_DiscreteWrite(&pb_speaker, 1, 0); MAILBOX_CMD_ADDR = 0x0; break; case PLAY_TONE: period_us = MAILBOX_DATA(0); num_cycles = MAILBOX_DATA(1); for(i=0; i<num_cycles; i++){ generateTone(period_us); } MAILBOX_CMD_ADDR = 0x0; break; case PLAY_DEMO: melody_demo(); MAILBOX_CMD_ADDR = 0x0; break; default: MAILBOX_CMD_ADDR = 0x0; break; } } return 0; }