I use SoapySDR because it supports more of my devices. SoapySDR actually calls the limesuite routines and there is nearly a one to one match between the routines. The setup and use of the liquidsdr routines is the same no matter which routines you use.
If you grab “microphoneFMTX2.cpp” from “https://github.com/righthalfplane/rfspace”, it is a program that transmits the audio from a microphone as NBFM (12.5Khz). I does things in two steps. It goes from the audio at 48000 hz to the FM bandwidth at 12500 hz converts the audio to FM and then converts the FM to the Sample rate to output a 12500 hz signal. If you want to transmit a tone, you do the same thing.
Everything that you are interested in is in two short sections. At lines 105-115 the programs sets the resample rates. At lines 198-213, it converts to 12500 hz, does the FM modulation, converts to the sample rate and transmits the data.
For what you want -
const double sample_rate = 400000;
float As = 60.0f;
float Ratio2 = (float)(sample_rate/(float)1000);
msresamp_crcf iqSampler2 = msresamp_crcf_create(Ratio2, As);
msresamp_crcf_execute(iqSampler2, (liquid_float_complex *)r2, num, (liquid_float_complex *)buf2, &num2);
may be all you need.